https://github.com/hms-dbmi/higlass
Raw File
Tip revision: b10ee3cf7a80c6afc22bb57fae9dba5496fbfe9a authored by sehilyi on 11 May 2023, 19:32:01 UTC
1.12.3
Tip revision: b10ee3c
DenseDataExtremaTests.js
/* eslint-env mocha */
import Enzyme from 'enzyme';
import Adapter from '@wojtekmaj/enzyme-adapter-react-17';
import { expect } from 'chai';

import FetchMockHelper from './utils/FetchMockHelper';

// Utils
import {
  mountHGComponent,
  removeHGComponent,
  waitForTransitionsFinished,
  waitForTilesLoaded,
} from '../app/scripts/test-helpers';
import { getTrackObjectFromHGC } from '../app/scripts/utils';

import viewConf1DHorizontal from './view-configs/continuous-scaling-1D-horizontal.json';
import viewConf1DVertical from './view-configs/continuous-scaling-1D-vertical.json';
import viewConf2D from './view-configs/continuous-scaling-2D.json';

import DenseDataExtrema1D from '../app/scripts/utils/DenseDataExtrema1D';
import DenseDataExtrema2D from '../app/scripts/utils/DenseDataExtrema2D';
import { vecToy, vecRealistic } from './testdata/vector-data';
import { matToy, matRealistic } from './testdata/matrix-data';

Enzyme.configure({ adapter: new Adapter() });

describe('Dense data extrema tests', () => {
  // We can pass in the view conf as first argument to perform some
  // basic compatibility checks. Since we have two view confs here, we skip this.
  const fetchMockHelper = new FetchMockHelper(null, 'DenseDataExtrema');

  before(async () => {
    await fetchMockHelper.activateFetchMock();
  });

  describe('DenseDataExtrema module', () => {
    it('should get precise extrema of toy vectors', () => {
      const dde = new DenseDataExtrema1D(vecToy);

      expect(dde.minNonZeroInTile).to.eql(1);
      expect(dde.maxNonZeroInTile).to.eql(63);

      expect(dde.getMinNonZeroInSubset([0, 1])).to.eql(Number.MAX_SAFE_INTEGER);

      expect(dde.getMinNonZeroInSubset([10, 33])).to.eql(10);
      expect(dde.getMaxNonZeroInSubset([10, 33])).to.eql(32);
      expect(dde.getMinNonZeroInSubset([21, 64])).to.eql(21);
      expect(dde.getMaxNonZeroInSubset([21, 64])).to.eql(63);
    });

    it('should get precise extrema of realistic vectors', () => {
      const dde = new DenseDataExtrema1D(vecRealistic);

      expect(dde.minNonZeroInTile).to.eql(0.0004627704620361328);
      expect(dde.maxNonZeroInTile).to.eql(0.075439453125);

      expect(dde.getMinNonZeroInSubset([76, 771])).to.eql(
        0.0009503364562988281,
      );
      expect(dde.getMaxNonZeroInSubset([76, 771])).to.eql(0.01194000244140625);
    });

    it('should get approximate extrema of toy matrix', () => {
      const dde = new DenseDataExtrema2D(matToy);

      expect(dde.minNonZeroInTile).to.eql(1);
      expect(dde.maxNonZeroInTile).to.eql(255);

      expect(dde.getMinNonZeroInSubset([0, 0, 1, 1])).to.eql(1);
      expect(dde.getMaxNonZeroInSubset([0, 0, 1, 1])).to.eql(17);

      expect(dde.getMinNonZeroInSubset([0, 2, 2, 5])).to.eql(32);
      expect(dde.getMaxNonZeroInSubset([0, 2, 2, 5])).to.eql(83);
    });

    it('should get approximate extrema of realistic matrix', () => {
      const dde = new DenseDataExtrema2D(matRealistic);

      expect(dde.minNonZeroInTile).to.eql(1);
      expect(dde.maxNonZeroInTile).to.eql(5748);

      expect(dde.getMinNonZeroInSubset([28, 40, 250, 120])).to.eql(1);
      expect(dde.getMaxNonZeroInSubset([28, 40, 250, 120])).to.eql(196);
    });
  });

  describe('Precise scaling of horizontal 1D tracks', () => {
    let hgc = null;
    let div = null;

    before((done) => {
      [div, hgc] = mountHGComponent(div, hgc, viewConf1DHorizontal, done, {
        extendedDelay: 1000, // additional delay in ms
      });
    });

    it('Ensures HorizontalPoint1DPixiTrack has correct scale', () => {
      const trackObj = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf1DHorizontal.views[0].uid,
        viewConf1DHorizontal.views[0].tracks.top[0].uid,
      );

      const vs = trackObj.valueScale.domain();
      expect(vs[0]).to.be.eql(10.96875);
      expect(vs[1]).to.be.eql(14800);
    });

    it('Ensures Horizontal1DHeatmapTrack has correct scale', () => {
      const trackObj = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf1DHorizontal.views[0].uid,
        viewConf1DHorizontal.views[0].tracks.top[1].uid,
      );

      const vs = trackObj.valueScale.domain();
      expect(vs[0]).to.be.eql(0.12999966740608215);
      expect(vs[1]).to.be.eql(0.3573390543460846);
    });

    it('Ensures HorizontalLine1DPixiTrack has correct scale', () => {
      const trackObj = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf1DHorizontal.views[0].uid,
        viewConf1DHorizontal.views[0].tracks.top[2].uid,
      );

      const vs = trackObj.valueScale.domain();
      expect(vs[0]).to.be.eql(11);
      expect(vs[1]).to.be.eql(12081);
    });

    it('Ensures valuescale locked BarTracks with ignoreOffScreenValue have correct scale', () => {
      const trackObj1 = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf1DHorizontal.views[0].uid,
        viewConf1DHorizontal.views[0].tracks.top[3].uid,
      );

      const trackObj2 = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf1DHorizontal.views[0].uid,
        viewConf1DHorizontal.views[0].tracks.top[4].uid,
      );

      const vs1 = trackObj1.valueScale.domain();
      const vs2 = trackObj2.valueScale.domain();
      expect(vs1[0]).to.be.eql(1.0107421875);
      expect(vs1[1]).to.be.eql(4.7421875);
      expect(vs2[0]).to.be.eql(1.0107421875);
      expect(vs2[1]).to.be.eql(4.7421875);
    });

    it('Ensures valuescale locked BarTrack and LineTrack without ignoreOffScreenValue have correct scale', () => {
      const trackObj1 = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf1DHorizontal.views[0].uid,
        viewConf1DHorizontal.views[0].tracks.top[5].uid,
      );

      const trackObj2 = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf1DHorizontal.views[0].uid,
        viewConf1DHorizontal.views[0].tracks.top[6].uid,
      );

      const vs1 = trackObj1.valueScale.domain();
      const vs2 = trackObj2.valueScale.domain();
      expect(vs1[0]).to.be.eql(0.004180908203125);
      expect(vs1[1]).to.be.eql(0.15536139905452728);
      expect(vs2[0]).to.be.eql(0.004180908203125);
      expect(vs2[1]).to.be.eql(0.15536139905452728);
    });

    it('Zooms and pan to the right', (done) => {
      hgc.instance().zoomTo('aa', 2619000000, 2620000000);

      waitForTransitionsFinished(hgc.instance(), () => {
        waitForTilesLoaded(hgc.instance(), () => {
          done();
        });
      });
    });

    it('Ensures HorizontalPoint1DPixiTrack has correct scale after zooming', () => {
      const trackObj = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf1DHorizontal.views[0].uid,
        viewConf1DHorizontal.views[0].tracks.top[0].uid,
      );

      const vs = trackObj.valueScale.domain();
      expect(vs[0]).to.be.eql(4.39453125);
      expect(vs[1]).to.be.eql(2194);
    });

    it('Ensures Horizontal1DHeatmapTrack has correct scale after zooming', () => {
      const trackObj = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf1DHorizontal.views[0].uid,
        viewConf1DHorizontal.views[0].tracks.top[1].uid,
      );

      const vs = trackObj.valueScale.domain();
      expect(vs[0]).to.be.eql(0.12999965250492096);
      expect(vs[1]).to.be.eql(0.6042279601097107);
    });

    it('Ensures HorizontalLine1DPixiTrack has correct scale after zooming', () => {
      const trackObj = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf1DHorizontal.views[0].uid,
        viewConf1DHorizontal.views[0].tracks.top[2].uid,
      );

      const vs = trackObj.valueScale.domain();

      expect(vs[0]).to.be.eql(180);
      expect(vs[1]).to.be.eql(91032);
    });

    after(() => {
      removeHGComponent(div);
    });
  });

  describe('Precise scaling of vertical 1D tracks', () => {
    let hgc = null;
    let div = null;

    before((done) => {
      [div, hgc] = mountHGComponent(div, hgc, viewConf1DVertical, done, {
        extendedDelay: 1000, // additional delay in ms
      });
    });

    it('Ensures leftmodified HorizontalPoint1DPixiTrack has correct scale', () => {
      const trackObj = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf1DVertical.views[0].uid,
        viewConf1DVertical.views[0].tracks.left[0].uid,
      ).originalTrack;

      waitForTilesLoaded(hgc.instance(), () => {
        const vs = trackObj.valueScale.domain();
        expect(vs[0]).to.be.eql(4308);
        expect(vs[1]).to.be.eql(33920);
      });
    });

    it('Ensures valuescale locked leftmodified BarTracks with ignoreOffScreenValue have correct scale', () => {
      const trackObj1 = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf1DVertical.views[0].uid,
        viewConf1DVertical.views[0].tracks.right[0].uid,
      ).originalTrack;

      const trackObj2 = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf1DVertical.views[0].uid,
        viewConf1DVertical.views[0].tracks.right[1].uid,
      ).originalTrack;

      const vs1 = trackObj1.valueScale.domain();
      const vs2 = trackObj2.valueScale.domain();

      expect(vs1[0]).to.be.eql(0.0009598731994628906);
      expect(vs1[1]).to.be.eql(1.5029296875);
      expect(vs2[0]).to.be.eql(0.0009598731994628906);
      expect(vs2[1]).to.be.eql(1.5029296875);
    });

    after(() => {
      removeHGComponent(div);
    });
  });

  describe('Correct scaling of 2D tracks', () => {
    let hgc = null;
    let div = null;

    before((done) => {
      [div, hgc] = mountHGComponent(div, hgc, viewConf2D, done, {
        style: 'width:600px; height:600px; background-color: lightgreen',
        bounded: true,
        extendedDelay: 1000,
      });
    });

    it('Ensures Heatmap track has correct scale', () => {
      const trackObj = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf2D.views[0].uid,
        viewConf2D.views[0].tracks.center[0].uid,
      ).childTracks[0];

      waitForTilesLoaded(hgc.instance(), () => {
        const vs = trackObj.valueScale.domain();

        expect(vs[0]).to.be.eql(0.0014894568594172597);
        expect(vs[1]).to.be.eql(0.9345257878303528);
      });
    });

    it('Pan to the right', (done) => {
      hgc.instance().zoomTo('aa', 1000000, 1250000, 0, 250000, 1000);

      waitForTransitionsFinished(hgc.instance(), () => {
        waitForTilesLoaded(hgc.instance(), () => {
          done();
        });
      });
    });

    // disabled to fix tests in PR #978
    // it('Ensures Heatmap track has correct scale after zoom', () => {
    //   const trackObj = getTrackObjectFromHGC(
    //     hgc.instance(),
    //     viewConf2D.views[0].uid,
    //     viewConf2D.views[0].tracks.center[0].uid
    //   ).childTracks[0];

    //   waitForTilesLoaded(hgc.instance(), () => {
    //     const vs = trackObj.valueScale.domain();

    //     expect(vs[0]).to.be.eql(0.0017257321160286665);
    //     expect(vs[1]).to.be.eql(0.01572374626994133);
    //   });
    // });

    after(() => {
      removeHGComponent(div);
    });
  });

  after(async () => {
    await fetchMockHelper.storeDataAndResetFetchMock();
  });
});
back to top