Skip to content

Commit 15a03e7

Browse files
committed
chore(splitter): apply code suggestions; reuse similar tests in functions
1 parent 218d90e commit 15a03e7

File tree

2 files changed

+148
-193
lines changed

2 files changed

+148
-193
lines changed

src/components/splitter/splitter.spec.ts

Lines changed: 146 additions & 191 deletions
Original file line numberDiff line numberDiff line change
@@ -801,218 +801,173 @@ describe('Splitter', () => {
801801
});
802802
});
803803

804-
// TODO: test when the slots have assigned sizes/min sizes + edge cases
805804
describe('Resizing with constraints and edge cases', () => {
806-
describe('Horizontal orientation', () => {
807-
it('should honor minSize and maxSize constraints when resizing, constraints in px', async () => {
808-
const mixedConstraintSplitter = await fixture<IgcSplitterComponent>(
809-
createTwoPanesWithSizesAndConstraints({
810-
startSize: '200px',
811-
startMinSize: '100px',
812-
startMaxSize: '300px',
813-
endSize: '200px',
814-
endMinSize: '100px',
815-
endMaxSize: '300px',
816-
})
817-
);
818-
await elementUpdated(mixedConstraintSplitter);
805+
const testMinMaxConstraintsPx = async (
806+
orientation: SplitterOrientation
807+
) => {
808+
const mixedConstraintSplitter = await fixture<IgcSplitterComponent>(
809+
createTwoPanesWithSizesAndConstraints({
810+
orientation,
811+
startSize: '200px',
812+
startMinSize: '100px',
813+
startMaxSize: '300px',
814+
endSize: '200px',
815+
endMinSize: '100px',
816+
endMaxSize: '300px',
817+
})
818+
);
819+
await elementUpdated(mixedConstraintSplitter);
819820

820-
let deltaX = 1000;
821-
await resize(mixedConstraintSplitter, deltaX, 0);
821+
const isX = orientation === 'horizontal';
822+
let delta = 1000;
823+
await resize(mixedConstraintSplitter, isX ? delta : 0, isX ? 0 : delta);
822824

823-
let sizes = getPanesSizes(mixedConstraintSplitter, 'width');
824-
expect(sizes.startSize).to.equal(300);
825+
let sizes = getPanesSizes(
826+
mixedConstraintSplitter,
827+
isX ? 'width' : 'height'
828+
);
829+
expect(sizes.startSize).to.equal(300);
825830

826-
deltaX = -1000;
827-
await resize(mixedConstraintSplitter, deltaX, 0);
831+
delta = -1000;
832+
await resize(mixedConstraintSplitter, isX ? delta : 0, isX ? 0 : delta);
828833

829-
sizes = getPanesSizes(mixedConstraintSplitter, 'width');
830-
expect(sizes.startSize).to.equal(100);
834+
sizes = getPanesSizes(mixedConstraintSplitter, isX ? 'width' : 'height');
835+
expect(sizes.startSize).to.equal(100);
831836

832-
deltaX = 1000;
833-
await resize(mixedConstraintSplitter, deltaX, 0);
837+
delta = 1000;
838+
await resize(mixedConstraintSplitter, isX ? delta : 0, isX ? 0 : delta);
839+
sizes = getPanesSizes(mixedConstraintSplitter, isX ? 'width' : 'height');
840+
expect(sizes.endSize).to.equal(100);
834841

835-
sizes = getPanesSizes(mixedConstraintSplitter, 'width');
836-
expect(sizes.endSize).to.equal(100);
842+
delta = -1000;
843+
await resize(mixedConstraintSplitter, isX ? delta : 0, isX ? 0 : delta);
837844

838-
deltaX = -1000;
839-
await resize(mixedConstraintSplitter, deltaX, 0);
845+
sizes = getPanesSizes(mixedConstraintSplitter, isX ? 'width' : 'height');
846+
expect(sizes.endSize).to.equal(300);
847+
};
840848

841-
sizes = getPanesSizes(mixedConstraintSplitter, 'width');
842-
expect(sizes.endSize).to.equal(300);
843-
});
849+
const testMinMaxConstraintsInPercentage = async (
850+
orientation: SplitterOrientation
851+
) => {
852+
const constraintSplitter = await fixture<IgcSplitterComponent>(
853+
createTwoPanesWithSizesAndConstraints({
854+
orientation,
855+
startSize: '30%',
856+
startMinSize: '10%',
857+
startMaxSize: '80%',
858+
endSize: '70%',
859+
endMinSize: '20%',
860+
endMaxSize: '90%',
861+
})
862+
);
863+
await elementUpdated(constraintSplitter);
844864

845-
it('should respect both panes constraints when they conflict during resize in px', async () => {
846-
const constraintSplitter = await fixture<IgcSplitterComponent>(
847-
createTwoPanesWithSizesAndConstraints({
848-
startSize: '200px',
849-
startMinSize: '100px',
850-
startMaxSize: '400px',
851-
endSize: '200px',
852-
endMinSize: '150px',
853-
endMaxSize: '350px',
854-
})
855-
);
856-
await elementUpdated(constraintSplitter);
857-
858-
const bar = getSplitterPart(constraintSplitter, 'bar');
859-
const barSize = bar.getBoundingClientRect().width;
860-
const totalAvailable = 500 - barSize;
861-
expect(totalAvailable).to.equal(495);
862-
863-
const initialSizes = getPanesSizes(constraintSplitter, 'width');
864-
const initialCombinedSize =
865-
initialSizes.startSize + initialSizes.endSize;
866-
867-
// Try to grow start pane to max, but end pane has min (150px)
868-
// Result: Start pane can only grow as much as end pane allows
869-
const deltaX = 1000;
870-
await resize(constraintSplitter, deltaX, 0);
871-
872-
const sizes = getPanesSizes(constraintSplitter, 'width');
873-
874-
// Start pane can only grow until end pane hits its minSize
875-
// Within the initial combined size of 400px - because of flex basis
876-
expect(sizes.startSize).to.equal(250);
877-
expect(sizes.endSize).to.equal(150);
878-
879-
expect(sizes.startSize + sizes.endSize).to.equal(initialCombinedSize);
880-
expect(sizes.startSize + sizes.endSize).to.be.at.most(totalAvailable);
865+
const isX = orientation === 'horizontal';
866+
867+
const bar = getSplitterPart(constraintSplitter, 'bar');
868+
const barSize = bar.getBoundingClientRect()[isX ? 'width' : 'height'];
869+
const totalAvailable = 500 - barSize;
870+
expect(totalAvailable).to.equal(495);
871+
872+
let delta = 1000;
873+
await resize(constraintSplitter, isX ? delta : 0, isX ? 0 : delta);
874+
875+
let sizes = getPanesSizes(constraintSplitter, isX ? 'width' : 'height');
876+
const expectedStartMax = Math.round((totalAvailable * 80) / 100);
877+
expect(sizes.startSize).to.be.closeTo(expectedStartMax, 2);
878+
879+
delta = -1000;
880+
await resize(constraintSplitter, isX ? delta : 0, isX ? 0 : delta);
881+
882+
sizes = getPanesSizes(constraintSplitter, isX ? 'width' : 'height');
883+
const expectedStartMin = Math.round((totalAvailable * 10) / 100);
884+
expect(sizes.startSize).to.be.closeTo(expectedStartMin, 2);
885+
886+
delta = 1000;
887+
await resize(constraintSplitter, isX ? delta : 0, isX ? 0 : delta);
888+
889+
sizes = getPanesSizes(constraintSplitter, isX ? 'width' : 'height');
890+
const expectedEndMin = Math.round((totalAvailable * 20) / 100);
891+
expect(sizes.endSize).to.be.closeTo(expectedEndMin, 2);
892+
893+
delta = -1000;
894+
await resize(constraintSplitter, isX ? delta : 0, isX ? 0 : delta);
895+
896+
sizes = getPanesSizes(constraintSplitter, isX ? 'width' : 'height');
897+
const expectedEndMax = Math.round((totalAvailable * 90) / 100);
898+
expect(sizes.endSize).to.be.closeTo(expectedEndMax, 2);
899+
};
900+
901+
const testConflictingConstraints = async (
902+
orientation: SplitterOrientation
903+
) => {
904+
const constraintSplitter = await fixture<IgcSplitterComponent>(
905+
createTwoPanesWithSizesAndConstraints({
906+
orientation,
907+
startSize: '200px',
908+
startMinSize: '100px',
909+
startMaxSize: '400px',
910+
endSize: '200px',
911+
endMinSize: '150px',
912+
endMaxSize: '350px',
913+
})
914+
);
915+
await elementUpdated(constraintSplitter);
916+
917+
const isX = orientation === 'horizontal';
918+
919+
const bar = getSplitterPart(constraintSplitter, 'bar');
920+
const barSize = bar.getBoundingClientRect()[isX ? 'width' : 'height'];
921+
const totalAvailable = 500 - barSize;
922+
expect(totalAvailable).to.equal(495);
923+
924+
const initialSizes = getPanesSizes(
925+
constraintSplitter,
926+
isX ? 'width' : 'height'
927+
);
928+
const initialCombinedSize = initialSizes.startSize + initialSizes.endSize;
929+
930+
// Try to grow start pane to max, but end pane has min (150px)
931+
// Result: Start pane can only grow as much as end pane allows
932+
const delta = 1000;
933+
await resize(constraintSplitter, isX ? delta : 0, isX ? 0 : delta);
934+
935+
const sizes = getPanesSizes(constraintSplitter, isX ? 'width' : 'height');
936+
937+
// Start pane can only grow until end pane hits its minSize
938+
// Within the initial combined size of 400px - because of flex basis
939+
expect(sizes.startSize).to.equal(250);
940+
expect(sizes.endSize).to.equal(150);
941+
942+
expect(sizes.startSize + sizes.endSize).to.equal(initialCombinedSize);
943+
expect(sizes.startSize + sizes.endSize).to.be.at.most(totalAvailable);
944+
};
945+
946+
describe('Horizontal orientation', () => {
947+
it('should honor minSize and maxSize constraints when resizing, constraints in px', async () => {
948+
await testMinMaxConstraintsPx('horizontal');
881949
});
882950

883951
it('should honor minSize and maxSize constraints when resizing, constraints in %', async () => {
884-
const constraintSplitter = await fixture<IgcSplitterComponent>(
885-
createTwoPanesWithSizesAndConstraints({
886-
startSize: '30%',
887-
startMinSize: '10%',
888-
startMaxSize: '80%',
889-
endSize: '70%',
890-
endMinSize: '20%',
891-
endMaxSize: '90%',
892-
})
893-
);
894-
await elementUpdated(constraintSplitter);
895-
896-
const bar = getSplitterPart(constraintSplitter, 'bar');
897-
const barSize = bar.getBoundingClientRect().width;
898-
const totalAvailable = 500 - barSize;
899-
expect(totalAvailable).to.equal(495);
900-
901-
let deltaX = 1000;
902-
await resize(constraintSplitter, deltaX, 0);
903-
904-
let sizes = getPanesSizes(constraintSplitter, 'width');
905-
const expectedStartMax = Math.round((totalAvailable * 80) / 100);
906-
expect(sizes.startSize).to.be.closeTo(expectedStartMax, 2);
907-
908-
deltaX = -1000;
909-
await resize(constraintSplitter, deltaX, 0);
910-
911-
sizes = getPanesSizes(constraintSplitter, 'width');
912-
const expectedStartMin = Math.round((totalAvailable * 10) / 100);
913-
expect(sizes.startSize).to.be.closeTo(expectedStartMin, 2);
914-
915-
deltaX = 1000;
916-
await resize(constraintSplitter, deltaX, 0);
917-
918-
sizes = getPanesSizes(constraintSplitter, 'width');
919-
const expectedEndMin = Math.round((totalAvailable * 20) / 100);
920-
expect(sizes.endSize).to.be.closeTo(expectedEndMin, 2);
921-
922-
deltaX = -1000;
923-
await resize(constraintSplitter, deltaX, 0);
924-
925-
sizes = getPanesSizes(constraintSplitter, 'width');
926-
const expectedEndMax = Math.round((totalAvailable * 90) / 100);
927-
expect(sizes.endSize).to.be.closeTo(expectedEndMax, 2);
952+
await testMinMaxConstraintsInPercentage('horizontal');
953+
});
954+
955+
it('should respect both panes constraints when they conflict during resize in px', async () => {
956+
await testConflictingConstraints('horizontal');
928957
});
929958
});
930959

931960
describe('Vertical orientation', () => {
932961
it('should honor minSize and maxSize constraints when resizing - constraints in px - vertical', async () => {
933-
const mixedConstraintSplitter = await fixture<IgcSplitterComponent>(
934-
createTwoPanesWithSizesAndConstraints({
935-
orientation: 'vertical',
936-
startSize: '200px',
937-
startMinSize: '100px',
938-
startMaxSize: '300px',
939-
endSize: '200px',
940-
endMinSize: '100px',
941-
endMaxSize: '300px',
942-
})
943-
);
944-
await elementUpdated(mixedConstraintSplitter);
945-
946-
let deltaY = 1000;
947-
await resize(mixedConstraintSplitter, 0, deltaY);
948-
949-
let sizes = getPanesSizes(mixedConstraintSplitter, 'height');
950-
expect(sizes.startSize).to.equal(300);
951-
952-
deltaY = -1000;
953-
await resize(mixedConstraintSplitter, 0, deltaY);
954-
955-
sizes = getPanesSizes(mixedConstraintSplitter, 'height');
956-
expect(sizes.startSize).to.equal(100);
957-
958-
deltaY = 1000;
959-
await resize(mixedConstraintSplitter, 0, deltaY);
960-
sizes = getPanesSizes(mixedConstraintSplitter, 'height');
961-
expect(sizes.endSize).to.equal(100);
962-
963-
deltaY = -1000;
964-
await resize(mixedConstraintSplitter, 0, deltaY);
965-
966-
sizes = getPanesSizes(mixedConstraintSplitter, 'height');
967-
expect(sizes.endSize).to.equal(300);
962+
await testMinMaxConstraintsPx('vertical');
968963
});
969964

970965
it('should honor minSize and maxSize constraints when resizing, constraints in % - vertical', async () => {
971-
const constraintSplitter = await fixture<IgcSplitterComponent>(
972-
createTwoPanesWithSizesAndConstraints({
973-
orientation: 'vertical',
974-
startSize: '30%',
975-
startMinSize: '10%',
976-
startMaxSize: '80%',
977-
endSize: '70%',
978-
endMinSize: '20%',
979-
endMaxSize: '90%',
980-
})
981-
);
982-
await elementUpdated(constraintSplitter);
983-
984-
const bar = getSplitterPart(constraintSplitter, 'bar');
985-
const barSize = bar.getBoundingClientRect().height;
986-
const totalAvailable = 500 - barSize;
987-
expect(totalAvailable).to.equal(495);
988-
989-
let deltaY = 1000;
990-
await resize(constraintSplitter, 0, deltaY);
991-
992-
let sizes = getPanesSizes(constraintSplitter, 'height');
993-
const expectedStartMax = Math.round((totalAvailable * 80) / 100);
994-
expect(sizes.startSize).to.be.closeTo(expectedStartMax, 2);
995-
996-
deltaY = -1000;
997-
await resize(constraintSplitter, 0, deltaY);
998-
999-
sizes = getPanesSizes(constraintSplitter, 'height');
1000-
const expectedStartMin = Math.round((totalAvailable * 10) / 100);
1001-
expect(sizes.startSize).to.be.closeTo(expectedStartMin, 2);
1002-
1003-
deltaY = 1000;
1004-
await resize(constraintSplitter, 0, deltaY);
1005-
1006-
sizes = getPanesSizes(constraintSplitter, 'height');
1007-
const expectedEndMin = Math.round((totalAvailable * 20) / 100);
1008-
expect(sizes.endSize).to.be.closeTo(expectedEndMin, 2);
1009-
1010-
deltaY = -1000;
1011-
await resize(constraintSplitter, 0, deltaY);
1012-
1013-
sizes = getPanesSizes(constraintSplitter, 'height');
1014-
const expectedEndMax = Math.round((totalAvailable * 90) / 100);
1015-
expect(sizes.endSize).to.be.closeTo(expectedEndMax, 2);
966+
await testMinMaxConstraintsInPercentage('vertical');
967+
});
968+
969+
it('should respect both panes constraints when they conflict during resize in px - vertical', async () => {
970+
await testConflictingConstraints('vertical');
1016971
});
1017972
});
1018973

src/components/splitter/splitter.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -461,10 +461,10 @@ export default class IgcSplitterComponent extends EventEmitterMixin<
461461
const totalSize = this.getTotalSize();
462462
let result: number;
463463
if (value.indexOf('%') !== -1) {
464-
const percentageValue = Number.parseInt(value ?? '0', 10) || 0;
464+
const percentageValue = Number.parseInt(value, 10) || 0;
465465
result = (percentageValue / 100) * totalSize;
466466
} else {
467-
result = Number.parseInt(value ?? '0', 10) || 0;
467+
result = Number.parseInt(value, 10) || 0;
468468
}
469469
return result;
470470
}

0 commit comments

Comments
 (0)