Bugfix in sorterByMetadataField - reverse order working correctly now

- new unit tests
This commit is contained in:
SebastianMC 2023-08-24 00:09:04 +02:00
parent e811d6d7e4
commit 24b37eb87c
2 changed files with 38 additions and 3 deletions

View File

@ -2274,3 +2274,38 @@ describe('CustomSortOrder.byMetadataFieldAlphabeticalReverse', () => {
expect(result3).toBe(SORT_ITEMS_ARE_EQUAL) expect(result3).toBe(SORT_ITEMS_ARE_EQUAL)
}) })
}) })
describe('sorterByMetadataField', () => {
it.each([
[true,'abc','def',-1, 'a', 'a'],
[true,'xyz','klm',1, 'b', 'b'],
[true,'mmm','mmm',0, 'c', 'c'],
[true,'mmm','mmm',-1, 'd', 'e'],
[true,'mmm','mmm',1, 'e', 'd'],
[true,'abc',undefined,-1, 'a','a'],
[true,undefined,'klm',1, 'b','b'],
[true,undefined,undefined,0, 'a','a'],
[true,undefined,undefined,-1, 'a','b'],
[true,undefined,undefined,1, 'd','c'],
[false,'abc','def',1, 'a', 'a'],
[false,'xyz','klm',-1, 'b', 'b'],
[false,'mmm','mmm',0, 'c', 'c'],
[false,'mmm','mmm',1, 'd', 'e'],
[false,'mmm','mmm',-1, 'e', 'd'],
[false,'abc',undefined,1, 'a','a'],
[false,undefined,'klm',-1, 'b','b'],
[false,undefined,undefined,0, 'a','a'],
[false,undefined,undefined,1, 'a','b'],
[false,undefined,undefined,-1, 'd','c'],
])('straight order %s, comparing %s and %s should return %s for sortStrings %s and %s',
(straight: boolean, metadataA: string|undefined, metadataB: string|undefined, order: number, sortStringA: string, sortStringB) => {
const sorterFn = sorterByMetadataField(!straight, false)
const itemA: Partial<FolderItemForSorting> = {metadataFieldValue: metadataA, sortString: sortStringA}
const itemB: Partial<FolderItemForSorting> = {metadataFieldValue: metadataB, sortString: sortStringB}
const result = sorterFn(itemA as FolderItemForSorting, itemB as FolderItemForSorting)
// then
expect(result).toBe(order)
})
})

View File

@ -71,7 +71,7 @@ const TrueAlphabetical: boolean = true
const ReverseOrder: boolean = true const ReverseOrder: boolean = true
const StraightOrder: boolean = false const StraightOrder: boolean = false
const sorterByMetadataField:(reverseOrder?: boolean, trueAlphabetical?: boolean) => SorterFn = (reverseOrder: boolean, trueAlphabetical?: boolean) => { export const sorterByMetadataField:(reverseOrder?: boolean, trueAlphabetical?: boolean) => SorterFn = (reverseOrder: boolean, trueAlphabetical?: boolean) => {
const collatorCompareFn: CollatorCompareFn = trueAlphabetical ? CollatorTrueAlphabeticalCompare : CollatorCompare const collatorCompareFn: CollatorCompareFn = trueAlphabetical ? CollatorTrueAlphabeticalCompare : CollatorCompare
return (a: FolderItemForSorting, b: FolderItemForSorting) => { return (a: FolderItemForSorting, b: FolderItemForSorting) => {
if (reverseOrder) { if (reverseOrder) {
@ -87,8 +87,8 @@ const sorterByMetadataField:(reverseOrder?: boolean, trueAlphabetical?: boolean)
} }
} }
// Item with metadata goes before the w/o metadata // Item with metadata goes before the w/o metadata
if (a.metadataFieldValue) return reverseOrder ? 1 : -1 if (a.metadataFieldValue) return -1
if (b.metadataFieldValue) return reverseOrder ? -1 : 1 if (b.metadataFieldValue) return 1
// Fallback -> requested sort by metadata, yet none of two items contain it, use alphabetical by name // Fallback -> requested sort by metadata, yet none of two items contain it, use alphabetical by name
return collatorCompareFn(a.sortString, b.sortString) return collatorCompareFn(a.sortString, b.sortString)
} }