|
|
import { observe } from "./observable";
|
|
|
import * as t from "tap";
|
|
|
|
|
|
const subj1 = observe<number>(({ next, complete }) => {
|
|
|
next(1);
|
|
|
complete();
|
|
|
next(2);
|
|
|
});
|
|
|
|
|
|
const consumer1 = {
|
|
|
sum: 0,
|
|
|
next(v: number) {
|
|
|
this.sum += v;
|
|
|
}
|
|
|
};
|
|
|
|
|
|
subj1.subscribe(consumer1);
|
|
|
t.equal(consumer1.sum, 1, "Should get only one value");
|
|
|
|
|
|
subj1.subscribe(consumer1);
|
|
|
t.equal(consumer1.sum, 2, "Should get the value again");
|
|
|
|
|
|
const consumer2 = {
|
|
|
value: 0,
|
|
|
completed: false,
|
|
|
next(v: number) { this.value = v; },
|
|
|
complete() { this.completed = true; }
|
|
|
};
|
|
|
|
|
|
let maps = 0;
|
|
|
|
|
|
subj1
|
|
|
.map(v => {
|
|
|
t.comment(`map1: ${v * 2}`);
|
|
|
maps++;
|
|
|
return v * 2;
|
|
|
})
|
|
|
.map(v => {
|
|
|
t.comment(`map2: ${v * 2}`);
|
|
|
maps++;
|
|
|
return v * 2;
|
|
|
})
|
|
|
.map(v => {
|
|
|
t.comment(`map3: ${v * 2}`);
|
|
|
maps++;
|
|
|
return v * 2;
|
|
|
})
|
|
|
.subscribe(consumer2);
|
|
|
|
|
|
t.equal(consumer2.value, 8, "Should map");
|
|
|
t.equal(maps, 3, "The map chain should not be executed after completion");
|
|
|
t.ok(consumer2.completed, "The completion signal should pass through");
|
|
|
|
|
|
const subj2 = observe<number>(({ next, complete }) => {
|
|
|
[1, 2, 3, 4, 5].forEach(next);
|
|
|
complete();
|
|
|
}).pipe<string>(self => ({ next, complete, error }) => {
|
|
|
t.comment("subj2: subscribe");
|
|
|
const h = self.subscribe({
|
|
|
next: val => {
|
|
|
if (val % 2 === 0)
|
|
|
next("odd");
|
|
|
else
|
|
|
next("even");
|
|
|
},
|
|
|
complete,
|
|
|
error
|
|
|
});
|
|
|
return () =>{
|
|
|
t.comment("subj2: unsubscribe");
|
|
|
h.unsubscribe();
|
|
|
};
|
|
|
});
|
|
|
|
|
|
subj2.subscribe({
|
|
|
next: val => t.comment("subj2: ", val),
|
|
|
complete: () => t.comment("subj2: complete")
|
|
|
});
|
|
|
subj2.subscribe({
|
|
|
next: val => t.comment("subj2: ", val),
|
|
|
complete: () => t.comment("subj2: complete")
|
|
|
});
|