@@ -13,16 +13,23 @@ import { StatusTypeField } from '../../../src/Query/Filter/StatusTypeField';
13
13
import { HappensDateField } from '../../../src/Query/Filter/HappensDateField' ;
14
14
import { DueDateField } from '../../../src/Query/Filter/DueDateField' ;
15
15
import { SearchInfo } from '../../../src/Query/SearchInfo' ;
16
- import { fromLine } from '../../TestingTools/TestHelpers' ;
16
+ import { fromLine , fromLines } from '../../TestingTools/TestHelpers' ;
17
17
import { TaskBuilder } from '../../TestingTools/TaskBuilder' ;
18
18
import { TasksFile } from '../../../src/Scripting/TasksFile' ;
19
+ import { FunctionField } from '../../../src/Query/Filter/FunctionField' ;
20
+ import type { TaskGroup } from '../../../src/Query/Group/TaskGroup' ;
19
21
20
22
window . moment = moment ;
21
23
22
- function makeTasksGroups ( grouping : Grouper [ ] , inputs : Task [ ] ) : any {
24
+ function makeTasksGroups ( grouping : Grouper [ ] , inputs : Task [ ] ) : TaskGroups {
23
25
return new TaskGroups ( grouping , inputs , SearchInfo . fromAllTasks ( inputs ) ) ;
24
26
}
25
27
28
+ beforeEach ( ( ) => { } ) ;
29
+
30
+ afterEach ( ( ) => {
31
+ jest . useRealTimers ( ) ;
32
+ } ) ;
26
33
describe ( 'Grouping tasks' , ( ) => {
27
34
it ( 'groups correctly by path' , ( ) => {
28
35
// Arrange
@@ -231,6 +238,30 @@ describe('Grouping tasks', () => {
231
238
` ) ;
232
239
} ) ;
233
240
241
+ it . failing ( 'sorts raw urgency value groups correctly' , ( ) => {
242
+ jest . useFakeTimers ( ) ;
243
+ jest . setSystemTime ( new Date ( '2025-03-07' ) ) ;
244
+
245
+ const lines = [
246
+ '- [ ] 1 📅 2025-03-07 ⏳ 2025-03-07' , // urgency: 15.75
247
+ '- [ ] 2 📅 2025-03-08 ⏳ 2025-03-07' , // urgency: 15.292857142857141
248
+ '- [ ] 3 📅 2025-03-09 ⏳ 2025-03-07' , // urgency: 14.835714285714285
249
+ ] ;
250
+ const tasks = fromLines ( { lines } ) ;
251
+
252
+ // See issue https://github.com/obsidian-tasks-group/obsidian-tasks/issues/3371
253
+ // order of groups, when grouping by "function task.urgency" without specifying precision, is confusing
254
+ // There is a problem with the sorting of groups whose floating-point values differ in precision,
255
+ // when grouping by the raw urgency value
256
+ const grouping = [ new FunctionField ( ) . createGrouperFromLine ( 'group by function task.urgency' ) ! ] ;
257
+
258
+ const groups : TaskGroups = makeTasksGroups ( grouping , tasks ) ;
259
+ const groupHeadings = groups . groups . map ( ( group : TaskGroup ) => group . groups [ 0 ] . slice ( 0 , 7 ) ) ;
260
+
261
+ expect ( groupHeadings ) . toEqual ( [ '14.8357' , '15.75' , '15.2928' ] ) ; // This passes: it shows that the order is illogical (non-ascending).
262
+ expect ( groupHeadings ) . toEqual ( [ '14.8357' , '15.2928' , '15.75' ] ) ; // This fails: it is what users would expect.
263
+ } ) ;
264
+
234
265
it ( 'handles tasks matching multiple groups correctly' , ( ) => {
235
266
const a = fromLine ( {
236
267
line : '- [ ] Task 1 #group1' ,
0 commit comments