import * as React from 'react';
import { mount } from 'enzyme';
import { expect } from 'chai';
import {
CancerCellFractionElementTooltip,
default as CancerCellFractionElement,
maxBarHeight,
} from 'shared/components/mutationTable/column/cancerCellFraction/CancerCellFractionElement';
import { getClonalCircleColor } from 'shared/components/mutationTable/column/clonal/ClonalElement';
import { ClonalValue } from 'shared/components/mutationTable/column/clonal/ClonalColumnFormatter';
import SampleManager from 'pages/patientView/SampleManager';
describe('CancerCellFractionElement', () => {
// For single sample test (only text displayed)
const validSingleSampleToCCFValue = {
S001: '0.94',
};
// invalid sample will have 'NA' (check column formatter)
const invalidSingleSampleToCCFValue = {
S001: 'NA',
};
// For multi sample test (bar chart displayed)
const invalidMultiSampleToCCFValue = {
S001: 'NA',
S002: 'NA',
S003: 'NA',
};
// For multi sample test (bar chart displayed)
const validMultiSampleToCCFValue = {
S001: '.50',
S002: 'NA',
S003: '1.00',
};
const sampleToClonalValue = {
S001: 'SUBCLONAL',
S002: 'NA',
S003: 'CLONAL',
};
const multiSampleSampleManager = new SampleManager(
[
{ id: 'S001', clinicalData: [] },
{ id: 'S002', clinicalData: [] },
{ id: 'S003', clinicalData: [] },
],
['S001', 'S002', 'S003']
);
function getCancerCellFractionProps(multi: boolean, valid: boolean) {
return {
sampleIds: multi ? ['S001', 'S002', 'S003'] : ['S001'],
sampleToClonalValue: sampleToClonalValue,
sampleToCCFValue: multi
? valid
? validMultiSampleToCCFValue
: invalidMultiSampleToCCFValue
: valid
? validSingleSampleToCCFValue
: invalidSingleSampleToCCFValue,
sampleManager: multi ? multiSampleSampleManager : undefined,
};
}
function testExpectedSingleSampleCCF(
CCFWrapper: any,
expectedText: string
) {
expect(CCFWrapper.find('DefaultTooltip')).to.have.lengthOf(0);
expect(CCFWrapper.find('CancerCellFractionBar')).to.have.lengthOf(0);
expect(CCFWrapper.find('span').text()).to.equal(expectedText);
}
// test rectangle adds up to max height
function testExpectedBarRectangle(
barRectangle: any,
expectedHeight: number,
expectedY: number,
clonalValue: ClonalValue
) {
expect(barRectangle.height).to.equal(expectedHeight);
expect(barRectangle.y).to.equal(expectedY);
expect(barRectangle.fill).to.equal(getClonalCircleColor(clonalValue));
}
function testExpectedCancerCellFractionTooltip(
cancerCellFractionColumn: any,
sampleId: string,
expectedCCFValue: string
) {
const cancerCellFractionTooltip = mount(
);
expect(
cancerCellFractionTooltip
.findWhere(n => n.type() === 'span' && n.key() === sampleId)
.text()
.split(' ')[1]
).to.equal(expectedCCFValue);
}
it('renders correctly for valid single sample', () => {
const validSingleSampleCancerCellFractionColumn = mount(
);
testExpectedSingleSampleCCF(
validSingleSampleCancerCellFractionColumn,
'0.94'
);
});
it('renders correctly for invalid single sample', () => {
const invalidSingleSampleCancerCellFractionColumn = mount(
);
testExpectedSingleSampleCCF(
invalidSingleSampleCancerCellFractionColumn,
'NA'
);
});
it('renders bar chart w/ tooltip for multiple samples', () => {
const multiSampleCancerCellFractionColumn = mount(
);
let sampleToCCFBar: { [key: string]: any } = {};
multiSampleCancerCellFractionColumn
.find('CancerCellFractionBar')
.forEach(node => {
sampleToCCFBar[node.key()] = node;
});
testExpectedBarRectangle(
sampleToCCFBar['S001'].find('rect').props(),
maxBarHeight * 0.5,
maxBarHeight - maxBarHeight * 0.5,
ClonalValue.SUBCLONAL
);
testExpectedBarRectangle(
sampleToCCFBar['S002'].find('rect').props(),
0,
maxBarHeight,
ClonalValue.NA
);
testExpectedBarRectangle(
sampleToCCFBar['S003'].find('rect').props(),
maxBarHeight,
0,
ClonalValue.CLONAL
);
testExpectedCancerCellFractionTooltip(
multiSampleCancerCellFractionColumn,
'S001',
'.50'
);
testExpectedCancerCellFractionTooltip(
multiSampleCancerCellFractionColumn,
'S002',
'NA'
);
testExpectedCancerCellFractionTooltip(
multiSampleCancerCellFractionColumn,
'S003',
'1.00'
);
});
it('renders bar chart w/ tooltip for multiple invalid samples', () => {
const multiSampleCancerCellFractionColumn = mount(
);
let sampleToCCFBar: { [key: string]: any } = {};
multiSampleCancerCellFractionColumn
.find('CancerCellFractionBar')
.forEach(node => {
sampleToCCFBar[node.key()] = node;
});
// all NA samples still have rectangles created with 0 height
testExpectedBarRectangle(
sampleToCCFBar['S001'].find('rect').props(),
0,
maxBarHeight,
ClonalValue.SUBCLONAL
);
testExpectedBarRectangle(
sampleToCCFBar['S002'].find('rect').props(),
0,
maxBarHeight,
ClonalValue.NA
);
testExpectedBarRectangle(
sampleToCCFBar['S003'].find('rect').props(),
0,
maxBarHeight,
ClonalValue.CLONAL
);
testExpectedCancerCellFractionTooltip(
multiSampleCancerCellFractionColumn,
'S001',
'NA'
);
testExpectedCancerCellFractionTooltip(
multiSampleCancerCellFractionColumn,
'S002',
'NA'
);
testExpectedCancerCellFractionTooltip(
multiSampleCancerCellFractionColumn,
'S003',
'NA'
);
});
});