from.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import assert from 'assert';
  2. import { testMethodProperty } from './properties.js';
  3. describe('from', () => {
  4. const iterable = {
  5. *[Symbol.iterator]() {
  6. yield 1;
  7. yield 2;
  8. yield 3;
  9. },
  10. };
  11. it('is a method on Observable', () => {
  12. testMethodProperty(Observable, 'from', {
  13. configurable: true,
  14. writable: true,
  15. length: 1,
  16. });
  17. });
  18. it('throws if the argument is null', () => {
  19. assert.throws(() => Observable.from(null));
  20. });
  21. it('throws if the argument is undefined', () => {
  22. assert.throws(() => Observable.from(undefined));
  23. });
  24. it('throws if the argument is not observable or iterable', () => {
  25. assert.throws(() => Observable.from({}));
  26. });
  27. describe('observables', () => {
  28. it('returns the input if the constructor matches "this"', () => {
  29. let ctor = function() {};
  30. let observable = new Observable(() => {});
  31. observable.constructor = ctor;
  32. assert.equal(Observable.from.call(ctor, observable), observable);
  33. });
  34. it('wraps the input if it is not an instance of Observable', () => {
  35. let obj = {
  36. 'constructor': Observable,
  37. [Symbol.observable]() { return this },
  38. };
  39. assert.ok(Observable.from(obj) !== obj);
  40. });
  41. it('throws if @@observable property is not a method', () => {
  42. assert.throws(() => Observable.from({
  43. [Symbol.observable]: 1
  44. }));
  45. });
  46. it('returns an observable wrapping @@observable result', () => {
  47. let inner = {
  48. subscribe(x) {
  49. observer = x;
  50. return () => { cleanupCalled = true };
  51. },
  52. };
  53. let observer;
  54. let cleanupCalled = true;
  55. let observable = Observable.from({
  56. [Symbol.observable]() { return inner },
  57. });
  58. observable.subscribe();
  59. assert.equal(typeof observer.next, 'function');
  60. observer.complete();
  61. assert.equal(cleanupCalled, true);
  62. });
  63. });
  64. describe('iterables', () => {
  65. it('throws if @@iterator is not a method', () => {
  66. assert.throws(() => Observable.from({ [Symbol.iterator]: 1 }));
  67. });
  68. it('returns an observable wrapping iterables', async () => {
  69. let calls = [];
  70. let subscription = Observable.from(iterable).subscribe({
  71. next(v) { calls.push(['next', v]) },
  72. complete() { calls.push(['complete']) },
  73. });
  74. assert.deepEqual(calls, []);
  75. await null;
  76. assert.deepEqual(calls, [
  77. ['next', 1],
  78. ['next', 2],
  79. ['next', 3],
  80. ['complete'],
  81. ]);
  82. });
  83. });
  84. });