From 991965125cd5bfbd06b7f29a046905b96ccd0ead Mon Sep 17 00:00:00 2001 From: "JiaLi.Passion" Date: Tue, 15 May 2018 23:19:55 +0900 Subject: [PATCH 1/3] add a test case with zone-testing --- .../internal/create/combineLatest-spec.ts | 32 +++++++++++++++++++ package-lock.json | 10 +++--- package.json | 7 ++-- 3 files changed, 40 insertions(+), 9 deletions(-) diff --git a/modules/core/internal/create/combineLatest-spec.ts b/modules/core/internal/create/combineLatest-spec.ts index 14d36f3fdb..0c0349173a 100644 --- a/modules/core/internal/create/combineLatest-spec.ts +++ b/modules/core/internal/create/combineLatest-spec.ts @@ -1,8 +1,21 @@ import { of } from "./of"; import { combineLatest } from "./combineLatest"; +import { Observable } from "../Observable"; + +function createIntervalObservable(interval: number) { + return new Observable(subscriber => { + let i = 0; + const id = setInterval(() => { + subscriber.next(i++); + }, interval); + return () => clearInterval(id); + }); +} // TODO: write a zone.js test to cover this with a timer describe('combineLatest', () => { + console.log('before combine test'); + it('should combine the latest values of multiple observables', () => { const results: any[] = []; @@ -15,4 +28,23 @@ describe('combineLatest', () => { complete() { results.push('done'); }, }); }); + + it('should combine the latest values of multiple observables with fakeAsync', fakeAsyncTest(() => { + const results: any[] = []; + const s1 = createIntervalObservable(1000); + const s2 = createIntervalObservable(2000); + const s3 = createIntervalObservable(3000); + combineLatest(s1, s2, s3).subscribe({ + next(value) { results.push(value); }, + complete() { results.push('done'); }, + }); + expect(results).toEqual([]); + tick(1000); + expect(results).toEqual([]); + tick(1000); + expect(results).toEqual([]); + tick(1000); + expect(results).toEqual([3, 2, 1]); + clearAllMacrotasks(); + })); }); diff --git a/package-lock.json b/package-lock.json index 6c5683c7c4..eced6319fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,12 +15,6 @@ "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==", "dev": true }, - "@types/mocha": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.0.0.tgz", - "integrity": "sha512-ZS0vBV7Jn5Z/Q4T3VXauEKMDCV8nWOtJJg90OsDylkYJiQwcWtKuLzohWzrthBkerUF7DLMmJcwOPEP0i/AOXw==", - "dev": true - }, "acorn": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", @@ -2301,6 +2295,10 @@ "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", "dev": true + }, + "zone.js": { + "version": "github:JiaLiPassion/zone.js#4e1fcefa78ffc892ae568962ce78afb13f02faab", + "dev": true } } } diff --git a/package.json b/package.json index 2e66c0bbda..5b21e27357 100644 --- a/package.json +++ b/package.json @@ -24,8 +24,9 @@ "watch": "Watch codebase, trigger compile when source code changes" }, "scripts": { - "test": "mocha -r ts-node/register modules/**/*-spec.ts", + "test": "npm run prepare-zone && mocha -r ts-node/register -r ./node_modules/zone.js/dist/zone-testing-node-bundle modules/**/*-spec.ts", "watch": "watch 'npm run test' modules", + "prepare-zone": "mkdir -p ./node_modules/@types/zone.js && cp ./node_modules/zone.js/lib/testing/zone-testing.typing.ts ./node_modules/@types/zone.js/index.d.ts", "build": "tsc" }, "repository": { @@ -55,7 +56,6 @@ }, "devDependencies": { "@types/chai": "^4.1.2", - "@types/mocha": "^5.0.0", "chai": "^4.1.2", "commitizen": "^2.9.6", "cz-conventional-changelog": "^2.1.0", @@ -64,6 +64,7 @@ "ts-node": "^5.0.1", "tslint": "^5.9.1", "typescript": "^2.8.1", - "watch": "^1.0.2" + "watch": "^1.0.2", + "zone.js": "github:JiaLiPassion/zone.js#rxjs-test-dist" } } From 9e8bfd2484ef7926f15101fc76d0e1524caa75a9 Mon Sep 17 00:00:00 2001 From: "JiaLi.Passion" Date: Wed, 16 May 2018 20:19:57 +0900 Subject: [PATCH 2/3] fix(test): make combineLatest pass test with zone-testing --- .../core/internal/create/combineLatest-spec.ts | 15 ++++++++------- modules/core/internal/create/combineLatest.ts | 3 ++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/modules/core/internal/create/combineLatest-spec.ts b/modules/core/internal/create/combineLatest-spec.ts index 0c0349173a..229287b845 100644 --- a/modules/core/internal/create/combineLatest-spec.ts +++ b/modules/core/internal/create/combineLatest-spec.ts @@ -14,8 +14,6 @@ function createIntervalObservable(interval: number) { // TODO: write a zone.js test to cover this with a timer describe('combineLatest', () => { - console.log('before combine test'); - it('should combine the latest values of multiple observables', () => { const results: any[] = []; @@ -27,13 +25,14 @@ describe('combineLatest', () => { next(value) { results.push(value); }, complete() { results.push('done'); }, }); + expect(results).toEqual([[1, 2, 3]]); }); it('should combine the latest values of multiple observables with fakeAsync', fakeAsyncTest(() => { const results: any[] = []; const s1 = createIntervalObservable(1000); - const s2 = createIntervalObservable(2000); - const s3 = createIntervalObservable(3000); + const s2 = createIntervalObservable(1500); + const s3 = createIntervalObservable(1800); combineLatest(s1, s2, s3).subscribe({ next(value) { results.push(value); }, complete() { results.push('done'); }, @@ -41,10 +40,12 @@ describe('combineLatest', () => { expect(results).toEqual([]); tick(1000); expect(results).toEqual([]); - tick(1000); + tick(500); expect(results).toEqual([]); - tick(1000); - expect(results).toEqual([3, 2, 1]); + tick(300); + expect(results).toEqual([[0, 0, 0]]); + tick(300); + expect(results).toEqual([[0, 0, 0], [1, 0, 0]]); clearAllMacrotasks(); })); }); diff --git a/modules/core/internal/create/combineLatest.ts b/modules/core/internal/create/combineLatest.ts index 7ccad6b7a6..783b950c22 100644 --- a/modules/core/internal/create/combineLatest.ts +++ b/modules/core/internal/create/combineLatest.ts @@ -29,8 +29,9 @@ export function combineLatestSource(sources: ObservableInput[]): Source src(FOType.SUBSCRIBE, (t: FOType, v: SinkArg, subs: Subscription) => { if(t === FOType.NEXT) { values[s] = v; + emittedOnce[s] = true; if (hasValues || (hasValues = emittedOnce.every(identity))) { - sink(FOType.NEXT, values.slice(0), subs); + sink(FOType.NEXT, values.slice(), subs); } } }, subs); From e27658eb6988f9e627de7aa0f70927495a906316 Mon Sep 17 00:00:00 2001 From: "JiaLi.Passion" Date: Wed, 16 May 2018 22:20:17 +0900 Subject: [PATCH 3/3] feat(test): add test sample for Date.now --- modules/core/internal/create/combineLatest-spec.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/modules/core/internal/create/combineLatest-spec.ts b/modules/core/internal/create/combineLatest-spec.ts index 229287b845..ab14e2fdfa 100644 --- a/modules/core/internal/create/combineLatest-spec.ts +++ b/modules/core/internal/create/combineLatest-spec.ts @@ -12,7 +12,6 @@ function createIntervalObservable(interval: number) { }); } -// TODO: write a zone.js test to cover this with a timer describe('combineLatest', () => { it('should combine the latest values of multiple observables', () => { const results: any[] = []; @@ -48,4 +47,13 @@ describe('combineLatest', () => { expect(results).toEqual([[0, 0, 0], [1, 0, 0]]); clearAllMacrotasks(); })); + + it('Date.now should be advanced by fakeAsyncTest', fakeAsyncTest(() => { + const start = Date.now(); + tick(100); + const end = Date.now(); + expect(end - start).toBe(100); + })); + + // TODO: Add a marble test with zone-testing. });