Skip to content

Instantly share code, notes, and snippets.

@valotas
Last active August 15, 2018 10:22
Show Gist options
  • Save valotas/c71a7aa41de5d03197a2 to your computer and use it in GitHub Desktop.
Save valotas/c71a7aa41de5d03197a2 to your computer and use it in GitHub Desktop.
RxJs Marble testing
<!DOCTYPE html>
<html>
<head>
<script src="https://npmcdn.com/@reactivex/[email protected]/dist/global/Rx.KitchenSink.umd.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.3.4/jasmine.min.css">
<script src="http://cdnjs.cloudflare.com/ajax/libs/jasmine/2.3.4/jasmine.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/jasmine/2.3.4/jasmine-html.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/jasmine/2.3.4/boot.min.js"></script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>RxJS Marble testing</title>
</head>
<body></body>
</html>
describe('rxjs TestScheduler', function () {
var rx = Rx.KitchenSink;
it('should be part of the Rx namespace', function () {
expect(rx).toBeDefined();
expect(rx.TestScheduler).toBeDefined();
});
describe('createHotObservable()', function () {
it('should create a hot observable emmiting the values given as marble strings', function () {
//given
var scheduler = new rx.TestScheduler(null);
var source = scheduler.createHotObservable('--a---b-cd-|');
var results = [];
//when
source
.bufferCount(2)
.map(function (array) {
return array.join('');
})
.subscribe(function (val) {
results.push(val);
}, null, function () {
results.push('done');
});
scheduler.flush();
expect(results).toEqual(['ab', 'cd', 'done']);
});
it('should create a hot observable emmiting the values given as marble strings', function () {
//given
var scheduler = new rx.TestScheduler(null);
var source = scheduler.createHotObservable('--a-^--b-c|');
var results = [];
//when
scheduler.schedule(function () {
source.subscribe(function (val) {
results.push(val);
}, null, function () {
results.push('done');
});
});
scheduler.flush();
expect(results).toEqual(['b', 'c', 'done']);
});
});
describe('createColdObservable()', function () {
it('should create a cold observable emmiting the values given as marble strings', function () {
//given
var scheduler = new rx.TestScheduler(null);
var source = scheduler.createColdObservable('--a---b|');
var results = [];
//when
source.subscribe(function (val) {
results.push(val);
});
scheduler.flush();
expect(results).toEqual(['a', 'b']);
});
});
it('should be reusable with time related operators', function () {
//given
var scheduler = new rx.TestScheduler(null);
var source = scheduler.createHotObservable('a----bcd-f|');
var results = [];
//when
source
.bufferTime(40, null, scheduler)
.map(function (buffer) {
return buffer.join('');
})
.subscribe(function (val) {
results.push(val);
});
scheduler.flush();
//then
expect(results).toEqual(['a', 'bcd', 'f']);
});
describe('schedule()', function () {
it('should schedule the subscription on the right time', function () {
//given
var scheduler = new rx.TestScheduler(null);
var source = scheduler.createHotObservable('--a-^--b-c|');
var results = [];
//when
scheduler.schedule(function () {
source.subscribe(function (val) {
results.push(val);
}, null, function () {
results.push('done');
});
});
scheduler.flush();
expect(results).toEqual(['b', 'c', 'done']);
});
it('should allow scheduling of non ending streams', function () {
//given
var scheduler = new rx.TestScheduler(null);
var source = scheduler.createHotObservable('--a-^--b-c');
var results = [];
//when
scheduler.schedule(function () {
source.subscribe(function (val) {
results.push(val);
}, null, function () {
results.push('done');
});
});
scheduler.flush();
expect(results).toEqual(['b', 'c']);
});
});
function assertEquals (actual, expected) {
expect(actual).toEqual(expected);
}
describe('expectObservable()', function () {
it('should simplify the result check of given observables', function () {
//given
var scheduler = new rx.TestScheduler(assertEquals);
var source = scheduler.createHotObservable('--a-^--b-c');
//then
scheduler.expectObservable(source).toBe('---b-c');
scheduler.flush();
});
});
describe('operators', function () {
describe('fromPromise()', function () {
it('should transform a Promise to an Observable', function (done) {
var promise = Promise.resolve('promise value');
rx.Observable.fromPromise(promise)
.subscribe(function (e) {
expect(e).toEqual('promise value');
}, done.fail, done);
});
});
describe('mergeMap()', function () {
it('should transform a Promise to an Observable', function () {
//given
var scheduler = new rx.TestScheduler(assertEquals);
var source = scheduler.createHotObservable('--a-^--b-c');
var other = scheduler.createColdObservable('-d--e');
//then
scheduler.expectObservable(source.mergeMap(function () {
return other;
})).toBe('----d-de-e');
scheduler.flush();
});
});
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment