function createContextDummy(i) {
			return {
				iIndex : i,
				created : function () { // every odd context looks "created"
					return i % 2 ? Promise.resolve() : undefined;
				},
				getPath : function () {
					return "/EMPLOYEES/" + i;
				}
			};
		}
******************************************************************************************
	QUnit.test("fetchDownloadUrl: Filter.NONE", function (assert) {
		const oBinding = this.bindList("n/a");

		this.mock(oBinding).expects("checkTransient").withExactArgs();
		this.mock(oBinding).expects("isResolved").returns(true);
		this.mock(oBinding).expects("hasFilterNone").returns(true);

		// code under test
		assert.strictEqual(oBinding.fetchDownloadUrl().getResult(), null);
	});

	//*********************************************************************************************
	QUnit.test("fetchDownloadUrl: unresolved", function (assert) {
		var oBinding = this.bindList("n/a");

		this.mock(oBinding).expects("isResolved").returns(false);

		assert.throws(function () {
			oBinding.fetchDownloadUrl();
		}, new Error("Binding is unresolved"));
	});

	//*********************************************************************************************
[false, true].forEach(function (bSuccess) {
	QUnit.test("requestDownloadUrl: success=" + bSuccess, function (assert) {
		var oBinding = this.bindList("/EMPLOYEES"),
			oError = new Error(),
			oPromise;

		this.mock(oBinding).expects("fetchDownloadUrl").withExactArgs()
			.returns(SyncPromise.resolve(
				bSuccess ? Promise.resolve("/service/resource?query") : Promise.reject(oError)
			));

		oPromise = oBinding.requestDownloadUrl();

		assert.ok(oPromise instanceof Promise);

		return oPromise.then(function (sResult) {
			assert.ok(bSuccess);
			assert.strictEqual(sResult, "/service/resource?query");
		}, function (oResult) {
			assert.notOk(bSuccess);
			assert.strictEqual(oResult, oError);
		});
	});
});

	//*********************************************************************************************
	QUnit.test("getDownloadUrl: success", function (assert) {
		var oBinding = this.bindList("/EMPLOYEES");

		this.mock(oBinding).expects("fetchDownloadUrl").withExactArgs()
			.returns(SyncPromise.resolve("/service/resource?query"));

		assert.strictEqual(oBinding.getDownloadUrl(), "/service/resource?query");
	});

	//*********************************************************************************************
	QUnit.test("getDownloadUrl: result pending", function (assert) {
		var oBinding = this.bindList("/EMPLOYEES"),
			oPromise = SyncPromise.resolve(Promise.resolve("/service/resource?query"));

		this.mock(oBinding).expects("fetchDownloadUrl").withExactArgs()
			.returns(oPromise);

		assert.throws(function () {
			// code under test
			oBinding.getDownloadUrl();
		}, new Error("Result pending"));

		return oPromise;
	});

	//*********************************************************************************************
	QUnit.test("getDownloadUrl: error", function (assert) {
		var oBinding = this.bindList("/EMPLOYEES"),
			oError = new Error("Failure");

		this.mock(oBinding).expects("fetchDownloadUrl").withExactArgs()
			.returns(SyncPromise.reject(oError));

		assert.throws(function () {
			// code under test
			oBinding.getDownloadUrl();
		}, oError);
	});

	//*********************************************************************************************
	QUnit.test("checkKeepAlive: header context", function (assert) {
		var oBinding = this.bindList("/EMPLOYEES");

		assert.throws(function () {
			// code under test
			oBinding.checkKeepAlive(oBinding.getHeaderContext());
		}, new Error("Unsupported header context " + oBinding.getHeaderContext()));
	});

	//*********************************************************************************************
	QUnit.test("checkKeepAlive: $$aggregation", function (assert) {
		var oBinding = this.bindList("/EMPLOYEES", undefined, undefined, undefined,
				{$$aggregation : {}}); // Note: no hierarchyQualifier!

		assert.throws(function () {
			// code under test
			oBinding.checkKeepAlive();
		}, new Error("Unsupported $$aggregation at " + oBinding));
	});

	//*********************************************************************************************
	QUnit.test("checkKeepAlive: $$aggregation w/ hierarchyQualifier", function () {
		var oBinding = this.bindList("/EMPLOYEES");

		// Note: autoExpandSelect at model would be required for hierarchyQualifier, but that leads
		// too far :-(
		oBinding.mParameters.$$aggregation = {hierarchyQualifier : "X"};

		// code under test (look, Ma - no error!)
		oBinding.checkKeepAlive();
	});

	//*********************************************************************************************
	QUnit.test("checkKeepAlive: $$sharedRequest", function (assert) {
		var oBinding = this.bindList("/EMPLOYEES", undefined, undefined, undefined,
				{$$sharedRequest : true});

		assert.throws(function () {
			// code under test
			oBinding.checkKeepAlive();
		}, new Error("Unsupported $$sharedRequest at " + oBinding));
	});

	//*********************************************************************************************
	QUnit.test("checkKeepAlive: sharedRequests from model", function (assert) {
		var oModel = new ODataModel({
				serviceUrl : "/service/?sap-client=111",
				sharedRequests : true
			}),
			oBinding = oModel.bindList("/EMPLOYEES");

		assert.throws(function () {
			// code under test
			oBinding.checkKeepAlive();
		}, new Error("Unsupported $$sharedRequest at " + oBinding));
	});

	//*********************************************************************************************
	QUnit.test("checkKeepAlive: relative", function (assert) {
		var oBinding,
			oParentContext = Context.createNewContext({/*oModel