From bfe001bf59809efae1c1ca15b4c5db5317ffeb83 Mon Sep 17 00:00:00 2001
From: Xiao Gui <xgui3783@gmail.com>
Date: Thu, 15 Jul 2021 17:36:28 +0200
Subject: [PATCH] bugfix: fix setcolormap emit pattern

---
 .../layerCtrl.service.spec.ts                 | 73 +++++++++++++------
 .../layerCtrl.service/layerCtrl.service.ts    |  4 +-
 2 files changed, 54 insertions(+), 23 deletions(-)

diff --git a/src/viewerModule/nehuba/layerCtrl.service/layerCtrl.service.spec.ts b/src/viewerModule/nehuba/layerCtrl.service/layerCtrl.service.spec.ts
index cb0e151e2..ffb2443d9 100644
--- a/src/viewerModule/nehuba/layerCtrl.service/layerCtrl.service.spec.ts
+++ b/src/viewerModule/nehuba/layerCtrl.service/layerCtrl.service.spec.ts
@@ -1,9 +1,11 @@
-import { TestBed } from "@angular/core/testing"
+import { fakeAsync, TestBed, tick } from "@angular/core/testing"
 import { MockStore, provideMockStore } from "@ngrx/store/testing"
 import { viewerStateSelectedParcellationSelector, viewerStateSelectedTemplateSelector } from "src/services/state/viewerState/selectors"
 import { NehubaLayerControlService } from "./layerCtrl.service"
 import * as layerCtrlUtil from '../constants'
 import { hot } from "jasmine-marbles"
+import { IColorMap } from "./layerCtrl.util"
+import { debounceTime } from "rxjs/operators"
 
 
 describe('> layerctrl.service.ts', () => {
@@ -169,6 +171,18 @@ describe('> layerctrl.service.ts', () => {
           })
         })
       })
+
+      const foobar1 = {
+        'foo-bar': {
+          1: { red: 100, green: 200, blue: 255 },
+          2: { red: 15, green: 15, blue: 15 },
+        }
+      }
+      const foobar2 = {
+        'foo-bar': {
+          2: { red: 255, green: 255, blue: 255 },
+        }
+      }
     
       describe('> overwriteColorMap$ firing', () => {
         beforeEach(() => {
@@ -191,32 +205,47 @@ describe('> layerctrl.service.ts', () => {
 
         it('> should overwrite existing colormap', () => {
           const service = TestBed.inject(NehubaLayerControlService)
-          service.overwriteColorMap$.next({
-            'foo-bar': {
-              2: {
-                red: 255,
-                green: 255,
-                blue: 255,
-              }
-            }
-          })
+          service.overwriteColorMap$.next(foobar2)
 
           expect(service.setColorMap$).toBeObservable(
-            hot('(ab)', {
-              a: {
-                'foo-bar': {
-                  1: { red: 100, green: 200, blue: 255 },
-                  2: { red: 15, green: 15, blue: 15 },
-                }
-              },
-              b: {
-                'foo-bar': {
-                  2: { red: 255, green: 255, blue: 255 },
-                }
-              }
+            hot('(b)', {
+              a: foobar1,
+              b: foobar2
             })
           )
         })
+
+        it('> unsub/resub should not result in overwritecolormap last emitted value', fakeAsync(() => {
+          const service = TestBed.inject(NehubaLayerControlService)
+
+          let subscrbiedVal: IColorMap
+          const sub = service.setColorMap$.pipe(
+            debounceTime(16),
+          ).subscribe(val => {
+            subscrbiedVal = val
+          })
+          
+          service.overwriteColorMap$.next(foobar2)
+          tick(32)
+          expect(subscrbiedVal).toEqual(foobar2)
+          tick(16)
+          sub.unsubscribe()
+          subscrbiedVal = null
+
+          // mock emit selectParc etc...
+          mockStore.overrideSelector(viewerStateSelectedParcellationSelector, {})
+          mockStore.setState({})
+          const sub2 = service.setColorMap$.pipe(
+            debounceTime(16),
+          ).subscribe(val => {
+            subscrbiedVal = val
+          })
+
+          tick(32)
+          expect(subscrbiedVal).toEqual(foobar1)
+          sub2.unsubscribe()
+
+        }))
       })
     })
 
diff --git a/src/viewerModule/nehuba/layerCtrl.service/layerCtrl.service.ts b/src/viewerModule/nehuba/layerCtrl.service/layerCtrl.service.ts
index 976074181..f0d0d7257 100644
--- a/src/viewerModule/nehuba/layerCtrl.service/layerCtrl.service.ts
+++ b/src/viewerModule/nehuba/layerCtrl.service/layerCtrl.service.ts
@@ -191,8 +191,10 @@ export class NehubaLayerControlService implements OnDestroy{
   public setColorMap$: Observable<IColorMap> = merge(
     this.activeColorMap$,
     this.overwriteColorMap$.pipe(
-      filter(v => !!v)
+      filter(v => !!v),
     )
+  ).pipe(
+    shareReplay(1)
   )
 
   public visibleLayer$: Observable<string[]> = combineLatest([
-- 
GitLab