diff --git a/chai-as-promised/chai-as-promised-tests.ts b/chai-as-promised/chai-as-promised-tests.ts
index 95a4335173..0b747d2c4c 100644
--- a/chai-as-promised/chai-as-promised-tests.ts
+++ b/chai-as-promised/chai-as-promised-tests.ts
@@ -1,23 +1,54 @@
///
+///
+///
import chai = require('chai');
import chaiAsPromised = require('chai-as-promised');
+import Q = require('q');
chai.use(chaiAsPromised);
// ReSharper disable WrongExpressionStatement
-var promise: any;
-chai.expect(promise).to.eventually.equal(3);
-chai.expect(promise).to.become(3);
-chai.expect(promise).to.be.fulfilled;
-chai.expect(promise).to.be.rejected;
-chai.expect(promise).to.be.rejectedWith(Error);
-chai.expect(promise).to.notify(() => console.log('done'));
+// BDD API (expect)
+var thenableNum: PromisesAPlus.Thenable;
+thenableNum = chai.expect(thenableNum).to.eventually.equal(3);
+thenableNum = chai.expect(thenableNum).to.eventually.have.property('foo');
+thenableNum = chai.expect(thenableNum).to.become(3);
+thenableNum = chai.expect(thenableNum).to.be.fulfilled;
+thenableNum = chai.expect(thenableNum).to.be.rejected;
+thenableNum = chai.expect(thenableNum).to.be.rejectedWith(Error);
+thenableNum = chai.expect(thenableNum).to.notify(() => console.log('done'));
-chai.assert.eventually.equal(promise, 4, 'Message');
-chai.assert.isFulfilled(promise, "optional message");
-chai.assert.becomes(promise, "foo", "optional message");
-chai.assert.doesNotBecome(promise, "foo", "optional message");
-chai.assert.isRejected(promise, "optional message");
-chai.assert.isRejected(promise, Error, "optional message");
-chai.assert.isRejected(promise, /error message matcher/, "optional message");
+// BDD API (should)
+thenableNum = thenableNum.should.be.fulfilled;
+thenableNum = thenableNum.should.eventually.deep.equal(3);
+thenableNum = thenableNum.should.become(3);
+thenableNum = thenableNum.should.be.rejected;
+thenableNum = thenableNum.should.be.rejectedWith(Error);
+thenableNum = thenableNum.should.eventually.equal(3).notify(() => console.log('done'));
+thenableNum = thenableNum.should.be.fulfilled.and.notify(() => console.log('done'));
+
+// Complex examples on https://github.com/domenic/chai-as-promised#working-with-non-promisefriendly-test-runners
+thenableNum.should.be.fulfilled.then(function () {
+ thenableNum.should.equal("after");
+}).should.notify(() => console.log('done'));
+
+Q.all([
+ thenableNum.should.become("happy"),
+ thenableNum.should.eventually.have.property("fun times"),
+ thenableNum.should.be.rejectedWith(TypeError, "only joyful types are allowed")
+]).should.notify(() => console.log('done'));
+
+// Assert API
+var thenableVoid: PromisesAPlus.Thenable;
+thenableVoid = chai.assert.eventually.equal(thenableNum, 4, 'Message');
+thenableVoid = chai.assert.isFulfilled(thenableNum, "optional message");
+thenableVoid = chai.assert.becomes(thenableNum, "foo", "optional message");
+thenableVoid = chai.assert.doesNotBecome(thenableNum, "foo", "optional message");
+thenableVoid = chai.assert.isRejected(thenableNum, "optional message");
+thenableVoid = chai.assert.isRejected(thenableNum, Error, "optional message");
+thenableVoid = chai.assert.isRejected(thenableNum, /error message matcher/, "optional message");
+
+// Check that original chai assertions are not broken
+var undef: void;
+undef = chai.assert.equal(10, 4, 'Message');
diff --git a/chai-as-promised/chai-as-promised.d.ts b/chai-as-promised/chai-as-promised.d.ts
index 106bbf41e8..51255b4902 100644
--- a/chai-as-promised/chai-as-promised.d.ts
+++ b/chai-as-promised/chai-as-promised.d.ts
@@ -1,9 +1,10 @@
// Type definitions for chai-as-promised
// Project: https://github.com/domenic/chai-as-promised/
-// Definitions by: jt000
+// Definitions by: jt000 , Yuki Kokubun
// Definitions: https://github.com/borisyankov/DefinitelyTyped
///
+///
declare module 'chai-as-promised' {
function chaiAsPromised(chai: any, utils: any): void;
@@ -12,25 +13,272 @@ declare module 'chai-as-promised' {
declare module Chai {
- interface Assertion {
- become(expected: any): Assertion;
- fulfilled: Assertion;
- rejected: Assertion;
- rejectedWith(expected: any): Assertion;
- notify(fn: Function): Assertion;
+ // For BDD API
+ interface Assertion extends LanguageChains, NumericComparison, TypeComparison {
+ eventually: PromisedAssertion;
+ become(expected: any): PromisedAssertion;
+ fulfilled: PromisedAssertion;
+ rejected: PromisedAssertion;
+ rejectedWith(expected: any, message?: string): PromisedAssertion;
+ notify(fn: Function): PromisedAssertion;
}
- interface LanguageChains {
- eventually: Assertion;
+ // Eventually does not have .then(), but PromisedAssertion have.
+ interface Eventually extends PromisedLanguageChains, PromisedNumericComparison, PromisedTypeComparison {
+ // From chai-as-promised
+ become(expected: PromisesAPlus.Thenable): PromisedAssertion;
+ fulfilled: PromisedAssertion;
+ rejected: PromisedAssertion;
+ rejectedWith(expected: any): PromisedAssertion;
+ notify(fn: Function): PromisedAssertion;
+
+ // From chai
+ not: PromisedAssertion;
+ deep: PromisedDeep;
+ a: PromisedTypeComparison;
+ an: PromisedTypeComparison;
+ include: PromisedInclude;
+ contain: PromisedInclude;
+ ok: PromisedAssertion;
+ true: PromisedAssertion;
+ false: PromisedAssertion;
+ null: PromisedAssertion;
+ undefined: PromisedAssertion;
+ exist: PromisedAssertion;
+ empty: PromisedAssertion;
+ arguments: PromisedAssertion;
+ Arguments: PromisedAssertion;
+ equal: PromisedEqual;
+ equals: PromisedEqual;
+ eq: PromisedEqual;
+ eql: PromisedEqual;
+ eqls: PromisedEqual;
+ property: PromisedProperty;
+ ownProperty: PromisedOwnProperty;
+ haveOwnProperty: PromisedOwnProperty;
+ length: PromisedLength;
+ lengthOf: PromisedLength;
+ match(regexp: RegExp|string, message?: string): PromisedAssertion;
+ string(string: string, message?: string): PromisedAssertion;
+ keys: PromisedKeys;
+ key(string: string): PromisedAssertion;
+ throw: PromisedThrow;
+ throws: PromisedThrow;
+ Throw: PromisedThrow;
+ respondTo(method: string, message?: string): PromisedAssertion;
+ itself: PromisedAssertion;
+ satisfy(matcher: Function, message?: string): PromisedAssertion;
+ closeTo(expected: number, delta: number, message?: string): PromisedAssertion;
+ members: PromisedMembers;
}
+ interface PromisedAssertion extends Eventually, PromisesAPlus.Thenable {
+ }
+
+ interface PromisedLanguageChains {
+ eventually: Eventually;
+
+ // From chai
+ to: PromisedAssertion;
+ be: PromisedAssertion;
+ been: PromisedAssertion;
+ is: PromisedAssertion;
+ that: PromisedAssertion;
+ which: PromisedAssertion;
+ and: PromisedAssertion;
+ has: PromisedAssertion;
+ have: PromisedAssertion;
+ with: PromisedAssertion;
+ at: PromisedAssertion;
+ of: PromisedAssertion;
+ same: PromisedAssertion;
+ }
+
+ interface PromisedNumericComparison {
+ above: PromisedNumberComparer;
+ gt: PromisedNumberComparer;
+ greaterThan: PromisedNumberComparer;
+ least: PromisedNumberComparer;
+ gte: PromisedNumberComparer;
+ below: PromisedNumberComparer;
+ lt: PromisedNumberComparer;
+ lessThan: PromisedNumberComparer;
+ most: PromisedNumberComparer;
+ lte: PromisedNumberComparer;
+ within(start: number, finish: number, message?: string): PromisedAssertion;
+ }
+
+ interface PromisedNumberComparer {
+ (value: number, message?: string): PromisedAssertion;
+ }
+
+ interface PromisedTypeComparison {
+ (type: string, message?: string): PromisedAssertion;
+ instanceof: PromisedInstanceOf;
+ instanceOf: PromisedInstanceOf;
+ }
+
+ interface PromisedInstanceOf {
+ (constructor: Object, message?: string): PromisedAssertion;
+ }
+
+ interface PromisedDeep {
+ equal: PromisedEqual;
+ include: PromisedInclude;
+ property: PromisedProperty;
+ }
+
+ interface PromisedEqual {
+ (value: any, message?: string): PromisedAssertion;
+ }
+
+ interface PromisedProperty {
+ (name: string, value?: any, message?: string): PromisedAssertion;
+ }
+
+ interface PromisedOwnProperty {
+ (name: string, message?: string): PromisedAssertion;
+ }
+
+ interface PromisedLength extends PromisedLanguageChains, PromisedNumericComparison {
+ (length: number, message?: string): PromisedAssertion;
+ }
+
+ interface PromisedInclude {
+ (value: Object, message?: string): PromisedAssertion;
+ (value: string, message?: string): PromisedAssertion;
+ (value: number, message?: string): PromisedAssertion;
+ keys: PromisedKeys;
+ members: PromisedMembers;
+ }
+
+ interface PromisedKeys {
+ (...keys: string[]): PromisedAssertion;
+ (keys: any[]): PromisedAssertion;
+ }
+
+ interface PromisedThrow {
+ (): PromisedAssertion;
+ (expected: string, message?: string): PromisedAssertion;
+ (expected: RegExp, message?: string): PromisedAssertion;
+ (constructor: Error, expected?: string, message?: string): PromisedAssertion;
+ (constructor: Error, expected?: RegExp, message?: string): PromisedAssertion;
+ (constructor: Function, expected?: string, message?: string): PromisedAssertion;
+ (constructor: Function, expected?: RegExp, message?: string): PromisedAssertion;
+ }
+
+ interface PromisedMembers {
+ (set: any[], message?: string): PromisedAssertion;
+ }
+
+ // For Assert API
interface Assert {
- eventually: Assert;
- isFulfilled(promise: any, message?: string): void;
- becomes(promise: any, expected: any, message?: string): void;
- doesNotBecome(promise: any, expected: any, message?: string): void;
- isRejected(promise: any, message?: string): void;
- isRejected(promise: any, expected: any, message?: string): void;
- isRejected(promise: any, match: RegExp, message?: string): void;
+ eventually: PromisedAssert;
+ isFulfilled(promise: PromisesAPlus.Thenable, message?: string): PromisesAPlus.Thenable;
+ becomes(promise: PromisesAPlus.Thenable, expected: any, message?: string): PromisesAPlus.Thenable;
+ doesNotBecome(promise: PromisesAPlus.Thenable, expected: any, message?: string): PromisesAPlus.Thenable;
+ isRejected(promise: PromisesAPlus.Thenable, message?: string): PromisesAPlus.Thenable;
+ isRejected(promise: PromisesAPlus.Thenable, expected: any, message?: string): PromisesAPlus.Thenable;
+ isRejected(promise: PromisesAPlus.Thenable, match: RegExp, message?: string): PromisesAPlus.Thenable;
+ notify(fn: Function): PromisesAPlus.Thenable;
+ }
+
+ export interface PromisedAssert {
+ fail(actual?: any, expected?: any, msg?: string, operator?: string): PromisesAPlus.Thenable;
+
+ ok(val: any, msg?: string): PromisesAPlus.Thenable;
+ notOk(val: any, msg?: string): PromisesAPlus.Thenable;
+
+ equal(act: any, exp: any, msg?: string): PromisesAPlus.Thenable;
+ notEqual(act: any, exp: any, msg?: string): PromisesAPlus.Thenable;
+
+ strictEqual(act: any, exp: any, msg?: string): PromisesAPlus.Thenable;
+ notStrictEqual(act: any, exp: any, msg?: string): PromisesAPlus.Thenable;
+
+ deepEqual(act: any, exp: any, msg?: string): PromisesAPlus.Thenable;
+ notDeepEqual(act: any, exp: any, msg?: string): PromisesAPlus.Thenable;
+
+ isTrue(val: any, msg?: string): PromisesAPlus.Thenable;
+ isFalse(val: any, msg?: string): PromisesAPlus.Thenable;
+
+ isNull(val: any, msg?: string): PromisesAPlus.Thenable;
+ isNotNull(val: any, msg?: string): PromisesAPlus.Thenable;
+
+ isUndefined(val: any, msg?: string): PromisesAPlus.Thenable;
+ isDefined(val: any, msg?: string): PromisesAPlus.Thenable;
+
+ isFunction(val: any, msg?: string): PromisesAPlus.Thenable;
+ isNotFunction(val: any, msg?: string): PromisesAPlus.Thenable;
+
+ isObject(val: any, msg?: string): PromisesAPlus.Thenable;
+ isNotObject(val: any, msg?: string): PromisesAPlus.Thenable;
+
+ isArray(val: any, msg?: string): PromisesAPlus.Thenable;
+ isNotArray(val: any, msg?: string): PromisesAPlus.Thenable;
+
+ isString(val: any, msg?: string): PromisesAPlus.Thenable;
+ isNotString(val: any, msg?: string): PromisesAPlus.Thenable;
+
+ isNumber(val: any, msg?: string): PromisesAPlus.Thenable;
+ isNotNumber(val: any, msg?: string): PromisesAPlus.Thenable;
+
+ isBoolean(val: any, msg?: string): PromisesAPlus.Thenable;
+ isNotBoolean(val: any, msg?: string): PromisesAPlus.Thenable;
+
+ typeOf(val: any, type: string, msg?: string): PromisesAPlus.Thenable;
+ notTypeOf(val: any, type: string, msg?: string): PromisesAPlus.Thenable;
+
+ instanceOf(val: any, type: Function, msg?: string): PromisesAPlus.Thenable;
+ notInstanceOf(val: any, type: Function, msg?: string): PromisesAPlus.Thenable;
+
+ include(exp: string, inc: any, msg?: string): PromisesAPlus.Thenable;
+ include(exp: any[], inc: any, msg?: string): PromisesAPlus.Thenable;
+
+ notInclude(exp: string, inc: any, msg?: string): PromisesAPlus.Thenable;
+ notInclude(exp: any[], inc: any, msg?: string): PromisesAPlus.Thenable;
+
+ match(exp: any, re: RegExp, msg?: string): PromisesAPlus.Thenable;
+ notMatch(exp: any, re: RegExp, msg?: string): PromisesAPlus.Thenable;
+
+ property(obj: Object, prop: string, msg?: string): PromisesAPlus.Thenable;
+ notProperty(obj: Object, prop: string, msg?: string): PromisesAPlus.Thenable;
+ deepProperty(obj: Object, prop: string, msg?: string): PromisesAPlus.Thenable;
+ notDeepProperty(obj: Object, prop: string, msg?: string): PromisesAPlus.Thenable;
+
+ propertyVal(obj: Object, prop: string, val: any, msg?: string): PromisesAPlus.Thenable;
+ propertyNotVal(obj: Object, prop: string, val: any, msg?: string): PromisesAPlus.Thenable;
+
+ deepPropertyVal(obj: Object, prop: string, val: any, msg?: string): PromisesAPlus.Thenable;
+ deepPropertyNotVal(obj: Object, prop: string, val: any, msg?: string): PromisesAPlus.Thenable;
+
+ lengthOf(exp: any, len: number, msg?: string): PromisesAPlus.Thenable;
+ //alias frenzy
+ throw(fn: Function, msg?: string): PromisesAPlus.Thenable;
+ throw(fn: Function, regExp: RegExp): PromisesAPlus.Thenable;
+ throw(fn: Function, errType: Function, msg?: string): PromisesAPlus.Thenable;
+ throw(fn: Function, errType: Function, regExp: RegExp): PromisesAPlus.Thenable;
+
+ throws(fn: Function, msg?: string): PromisesAPlus.Thenable;
+ throws(fn: Function, regExp: RegExp): PromisesAPlus.Thenable;
+ throws(fn: Function, errType: Function, msg?: string): PromisesAPlus.Thenable;
+ throws(fn: Function, errType: Function, regExp: RegExp): PromisesAPlus.Thenable;
+
+ Throw(fn: Function, msg?: string): PromisesAPlus.Thenable;
+ Throw(fn: Function, regExp: RegExp): PromisesAPlus.Thenable;
+ Throw(fn: Function, errType: Function, msg?: string): PromisesAPlus.Thenable;
+ Throw(fn: Function, errType: Function, regExp: RegExp): PromisesAPlus.Thenable;
+
+ doesNotThrow(fn: Function, msg?: string): PromisesAPlus.Thenable;
+ doesNotThrow(fn: Function, regExp: RegExp): PromisesAPlus.Thenable;
+ doesNotThrow(fn: Function, errType: Function, msg?: string): PromisesAPlus.Thenable;
+ doesNotThrow(fn: Function, errType: Function, regExp: RegExp): PromisesAPlus.Thenable;
+
+ operator(val: any, operator: string, val2: any, msg?: string): PromisesAPlus.Thenable;
+ closeTo(act: number, exp: number, delta: number, msg?: string): PromisesAPlus.Thenable;
+
+ sameMembers(set1: any[], set2: any[], msg?: string): PromisesAPlus.Thenable;
+ includeMembers(set1: any[], set2: any[], msg?: string): PromisesAPlus.Thenable;
+
+ ifError(val: any, msg?: string): PromisesAPlus.Thenable;
}
}