Skip to content

Commit f79c1ab

Browse files
authored
test: add AscendingCmp and DescendingCmp (#113)
* test: add AscendingCmp and DescendingCmp for asserting a slice of elements is increasing or decreasing by using a comparison function of signature 'func(A, B) int' * test: fix comments and assertions wording
1 parent b916b2b commit f79c1ab

5 files changed

Lines changed: 160 additions & 12 deletions

File tree

internal/assertions/assertions.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,19 @@ func AscendingFunc[A any](slice []A, less func(a, b A) bool) (s string) {
558558
return
559559
}
560560

561+
func AscendingCmp[A any](slice []A, compare func(a, b A) int) (s string) {
562+
for i := 0; i < len(slice)-1; i++ {
563+
cmp := compare(slice[i], slice[i+1])
564+
if cmp > 0 {
565+
s = fmt.Sprintf("expected compare(slice[%d], slice[%d]) <= 0\n", i, i+1)
566+
s += bullet("slice[%d]: %v\n", i, slice[i])
567+
s += bullet("slice[%d]: %v\n", i+1, slice[i+1])
568+
return
569+
}
570+
}
571+
return
572+
}
573+
561574
func AscendingLess[L interfaces.LessFunc[L]](slice []L) (s string) {
562575
for i := 0; i < len(slice)-1; i++ {
563576
if !slice[i].Less(slice[i+1]) {
@@ -594,6 +607,19 @@ func DescendingFunc[A any](slice []A, less func(a, b A) bool) (s string) {
594607
return
595608
}
596609

610+
func DescendingCmp[A any](slice []A, compare func(a, b A) int) (s string) {
611+
for i := 0; i < len(slice)-1; i++ {
612+
cmp := compare(slice[i], slice[i+1])
613+
if cmp < 0 {
614+
s = fmt.Sprintf("expected compare(slice[%d], slice[%d]) >= 0\n", i, i+1)
615+
s += bullet("slice[%d]: %v\n", i, slice[i])
616+
s += bullet("slice[%d]: %v\n", i+1, slice[i+1])
617+
return
618+
}
619+
}
620+
return
621+
}
622+
597623
func DescendingLess[L interfaces.LessFunc[L]](slice []L) (s string) {
598624
for i := 0; i < len(slice)-1; i++ {
599625
if !(slice[i+1].Less(slice[i])) {

must/must.go

Lines changed: 18 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

must/must_test.go

Lines changed: 49 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test.go

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -309,37 +309,49 @@ func BetweenExclusive[O constraints.Ordered](t T, lower, val, upper O, settings
309309
invoke(t, assertions.BetweenExclusive(lower, val, upper), settings...)
310310
}
311311

312-
// Ascending asserts slice[n] ≤ slice[n+1] for each element n.
312+
// Ascending asserts slice[n] ≤ slice[n+1] for each element.
313313
func Ascending[O constraints.Ordered](t T, slice []O, settings ...Setting) {
314314
t.Helper()
315315
invoke(t, assertions.Ascending(slice), settings...)
316316
}
317317

318-
// AscendingFunc asserts slice[n] is less than slice[n+1] for each element n using the less comparator.
318+
// AscendingFunc asserts slice[n] is less than slice[n+1] for each element using the less comparator.
319319
func AscendingFunc[A any](t T, slice []A, less func(A, A) bool, settings ...Setting) {
320320
t.Helper()
321321
invoke(t, assertions.AscendingFunc(slice, less), settings...)
322322
}
323323

324-
// AscendingLess asserts slice[n].Less(slice[n+1]) for each element n.
324+
// AscendingCmp asserts slice[n] is less than slice[n+1] for each element using the cmp comparator.
325+
func AscendingCmp[A any](t T, slice []A, compare func(A, A) int, settings ...Setting) {
326+
t.Helper()
327+
invoke(t, assertions.AscendingCmp(slice, compare), settings...)
328+
}
329+
330+
// AscendingLess asserts slice[n].Less(slice[n+1]) for each element.
325331
func AscendingLess[L interfaces.LessFunc[L]](t T, slice []L, settings ...Setting) {
326332
t.Helper()
327333
invoke(t, assertions.AscendingLess(slice), settings...)
328334
}
329335

330-
// Descending asserts slice[n] ≥ slice[n+1] for each element n.
336+
// Descending asserts slice[n] ≥ slice[n+1] for each element.
331337
func Descending[O constraints.Ordered](t T, slice []O, settings ...Setting) {
332338
t.Helper()
333339
invoke(t, assertions.Descending(slice), settings...)
334340
}
335341

336-
// DescendingFunc asserts slice[n+1] is less than slice[n] for each element n using the less comparator.
342+
// DescendingFunc asserts slice[n+1] is less than slice[n] for each element using the less comparator.
337343
func DescendingFunc[A any](t T, slice []A, less func(A, A) bool, settings ...Setting) {
338344
t.Helper()
339345
invoke(t, assertions.DescendingFunc(slice, less), settings...)
340346
}
341347

342-
// DescendingLess asserts slice[n+1].Less(slice[n]) for each element n.
348+
// DescendingCmp asserts slice[n+1] is ≤ slice[n] for each element.
349+
func DescendingCmp[A any](t T, slice []A, compare func(A, A) int, settings ...Setting) {
350+
t.Helper()
351+
invoke(t, assertions.DescendingCmp(slice, compare), settings...)
352+
}
353+
354+
// DescendingLess asserts slice[n+1].Less(slice[n]) for each element.
343355
func DescendingLess[L interfaces.LessFunc[L]](t T, slice []L, settings ...Setting) {
344356
t.Helper()
345357
invoke(t, assertions.DescendingLess(slice), settings...)

test_test.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -882,6 +882,31 @@ func TestAscendingFunc(t *testing.T) {
882882
})
883883
}
884884

885+
func TestAscendingCmp(t *testing.T) {
886+
tc := newCase(t, `expected compare`)
887+
t.Cleanup(tc.assert)
888+
889+
l := []*Person{
890+
{ID: 100, Name: "Alice"},
891+
{ID: 200, Name: "Bob"},
892+
{ID: 300, Name: "Dale"},
893+
{ID: 400, Name: "Carl"},
894+
}
895+
896+
cmp := func(p1, p2 *Person) int {
897+
switch {
898+
case p1.Name < p2.Name:
899+
return -1
900+
case p1.Name > p2.Name:
901+
return 1
902+
default:
903+
return 0
904+
}
905+
}
906+
907+
AscendingCmp(tc, l, cmp)
908+
}
909+
885910
func TestAscendingLess(t *testing.T) {
886911
tc := newCase(t, `expected slice`)
887912
t.Cleanup(tc.assert)
@@ -927,6 +952,30 @@ func TestDescendingFunc(t *testing.T) {
927952
})
928953
}
929954

955+
func TestDescendingCmp(t *testing.T) {
956+
tc := newCase(t, `expected compare`)
957+
t.Cleanup(tc.assert)
958+
l := []*Person{
959+
{ID: 400, Name: "Dale"},
960+
{ID: 300, Name: "Bob"},
961+
{ID: 200, Name: "Carl"},
962+
{ID: 100, Name: "Alice"},
963+
}
964+
965+
cmp := func(p1, p2 *Person) int {
966+
switch {
967+
case p1.Name < p2.Name:
968+
return -1
969+
case p1.Name > p2.Name:
970+
return 1
971+
default:
972+
return 0
973+
}
974+
}
975+
976+
DescendingCmp(tc, l, cmp)
977+
}
978+
930979
func TestDescendingLess(t *testing.T) {
931980
tc := newCase(t, `expected slice`)
932981
t.Cleanup(tc.assert)

0 commit comments

Comments
 (0)