@@ -160,6 +160,7 @@ term_order(_Config) ->
160160 term_order_num_fields (),
161161 term_order_keys (),
162162 term_order_values (),
163+ term_order_fields (),
163164
164165 ok .
165166
@@ -245,6 +246,29 @@ term_order_values() ->
245246 fake_record (r , false , [{b ,{10 }}, {a ,{5 }}])),
246247 ok .
247248
249+ % % Records that only differ in a non-first field.
250+ term_order_fields () ->
251+ % % 2-field record, difference in second field.
252+ true = is_lt (id (# bb {a = 1 , b = 2 }), id (# bb {a = 1 , b = 3 })),
253+
254+ % % 3-field record, difference in middle field.
255+ true = is_lt (id (# b {x = 1 , y = 1 , z = 1 }), id (# b {x = 1 , y = 2 , z = 1 })),
256+
257+ % % 3-field record, difference in last field.
258+ true = is_lt (id (# b {x = 1 , y = 1 , z = 1 }), id (# b {x = 1 , y = 1 , z = 2 })),
259+
260+ % % Multiple differing fields where the first sorted field is equal
261+ % % (exercises the push-multiple path in the value comparator).
262+ true = is_lt (id (# b {x = 1 , y = 1 , z = 1 }), id (# b {x = 1 , y = 2 , z = 2 })),
263+
264+ % % lists:sort/1 uses term order under the hood.
265+ L0 = [id (# b {x = 1 , y = 3 , z = 1 }),
266+ id (# b {x = 1 , y = 1 , z = 1 }),
267+ id (# b {x = 1 , y = 2 , z = 1 })],
268+ [# b {y = 1 }, # b {y = 2 }, # b {y = 3 }] = lists :sort (L0 ),
269+
270+ ok .
271+
248272is_gt (A , B ) ->
249273 Res = id (A > B ),
250274 Res = id (B < A ),
0 commit comments