From 45f818432c42579fd9bff2c10197efb36288214b Mon Sep 17 00:00:00 2001
From: Xiao Gui <xgui3783@gmail.com>
Date: Mon, 15 Feb 2021 11:19:30 +0100
Subject: [PATCH] bugfix: region colour

---
 spec/test.ts                                  | 12 ++-
 .../parcellationRegion/region.base.spec.ts    | 94 ++++++++++++++++++-
 .../parcellationRegion/region.base.ts         |  6 +-
 3 files changed, 103 insertions(+), 9 deletions(-)

diff --git a/spec/test.ts b/spec/test.ts
index 478be25bb..7e0ab9cc3 100644
--- a/spec/test.ts
+++ b/spec/test.ts
@@ -18,10 +18,12 @@ getTestBed().initTestEnvironment(
   platformBrowserDynamicTesting()
 );
 
-const testContext = require.context('../src', true, /\.spec\.ts$/)
-testContext.keys().map(testContext)
+// const testContext = require.context('../src', true, /\.spec\.ts$/)
+// testContext.keys().map(testContext)
 
-const workerCtx = require.context('../worker', true, /\.spec\.js$/)
-workerCtx.keys().map(workerCtx)
+// const workerCtx = require.context('../worker', true, /\.spec\.js$/)
+// workerCtx.keys().map(workerCtx)
 
-require('../common/util.spec.js')
+// require('../common/util.spec.js')
+
+require('../src/atlasComponents/parcellationRegion/region.base.spec')
\ No newline at end of file
diff --git a/src/atlasComponents/parcellationRegion/region.base.spec.ts b/src/atlasComponents/parcellationRegion/region.base.spec.ts
index e70c0f3b9..88a2ca8e3 100644
--- a/src/atlasComponents/parcellationRegion/region.base.spec.ts
+++ b/src/atlasComponents/parcellationRegion/region.base.spec.ts
@@ -1,6 +1,7 @@
 import { TestBed } from '@angular/core/testing'
 import { MockStore, provideMockStore } from '@ngrx/store/testing'
 import { RegionBase, regionInOtherTemplateSelector, getRegionParentParcRefSpace } from './region.base'
+const  util = require('common/util')
 
 /**
  * regions
@@ -446,7 +447,7 @@ describe('> region.base.ts', () => {
     beforeEach(() => {
       TestBed.configureTestingModule({
         providers: [
-          provideMockStore()
+          provideMockStore({ initialState: {} })
         ]
       })
     })
@@ -520,5 +521,96 @@ describe('> region.base.ts', () => {
         expect(regionBase.position).toBeTruthy()
       })
     })
+  
+    describe('> rgb', () => {
+      let strToRgbSpy: jasmine.Spy
+      let mockStore: MockStore
+      beforeEach(() => {
+        strToRgbSpy = spyOn(util, 'strToRgb')
+        mockStore = TestBed.inject(MockStore)
+        mockStore.overrideSelector(regionInOtherTemplateSelector, [])
+        mockStore.overrideSelector(getRegionParentParcRefSpace, { template: null, parcellation: null })
+      })
+
+      afterEach(() => {
+        strToRgbSpy.calls.reset()
+      })
+
+      it('> will take region.rgb if exists', () => {
+        const regionBase = new RegionBase(mockStore)
+        regionBase.region = {
+          rgb: [100, 120, 140]
+        }
+        expect(
+          regionBase.rgbString
+        ).toEqual(`rgb(100,120,140)`)
+      })
+
+      it('> if rgb not provided, and labelIndex > 65500, set to white', () => {
+
+        const regionBase = new RegionBase(mockStore)
+        regionBase.region = {
+          labelIndex: 65535
+        }
+        expect(
+          regionBase.rgbString
+        ).toEqual(`rgb(255,255,255)`)
+      })
+
+      describe('> if rgb not provided, labelIndex < 65500', () => {
+
+        describe('> arguments for strToRgb', () => {
+          it('> if ngId is defined, use ngId', () => {
+            
+            const regionBase = new RegionBase(mockStore)
+            regionBase.region = {
+              ngId: 'foo',
+              name: 'bar',
+              labelIndex: 152
+            }
+            expect(strToRgbSpy).toHaveBeenCalledWith(`foo152`)
+          })
+          it('> if ngId is not defined, use name', () => {
+
+            const regionBase = new RegionBase(mockStore)
+            regionBase.region = {
+              name: 'bar',
+              labelIndex: 152
+            }
+            expect(strToRgbSpy).toHaveBeenCalledWith(`bar152`)
+          })
+        })
+
+        it('> calls strToRgb, and use return value for rgb', () => {
+          const getRandomNum = () => Math.floor(255*Math.random())
+          const arr = [
+            getRandomNum(),
+            getRandomNum(),
+            getRandomNum()
+          ]
+          strToRgbSpy.and.returnValue(arr)
+          const regionBase = new RegionBase(mockStore)
+          regionBase.region = {
+            foo: 'bar'
+          }
+          expect(
+            regionBase.rgbString
+          ).toEqual(`rgb(${arr.join(',')})`)
+        })
+
+        it('> if strToRgb returns falsy, uses fallback', () => {
+
+          strToRgbSpy.and.returnValue(null)
+          const regionBase = new RegionBase(mockStore)
+          regionBase.region = {
+            foo: 'bar'
+          }
+          expect(
+            regionBase.rgbString
+          ).toEqual(`rgb(255,200,200)`)
+        })
+
+      })
+    })
   })
 })
diff --git a/src/atlasComponents/parcellationRegion/region.base.ts b/src/atlasComponents/parcellationRegion/region.base.ts
index d85da3b27..b1d159e64 100644
--- a/src/atlasComponents/parcellationRegion/region.base.ts
+++ b/src/atlasComponents/parcellationRegion/region.base.ts
@@ -37,9 +37,9 @@ export class RegionBase {
     if (!this._region) return
 
     let rgb = this._region.rgb
-    rgb = rgb || this._region.labelIndex > 65500 ? [255, 255, 255] : null
-    rgb = rgb || strToRgb(`${this._region.ngId || this._region.name}${this._region.labelIndex}`)
-    rgb = rgb || [255, 200, 200]
+      || (this._region.labelIndex > 65500 && [255, 255, 255])
+      || strToRgb(`${this._region.ngId || this._region.name}${this._region.labelIndex}`)
+      || [255, 200, 200]
     
     this.rgbString = `rgb(${rgb.join(',')})`
     const [_h, _s, l] = rgbToHsl(...rgb)
-- 
GitLab