Empty, one, two, many
Four cases that between them catch a startling share of real defects.
Most functions that take a collection are written while thinking about a collection with several things in it. The defects live everywhere else.
Empty is where loops do not run, reduces need an initial value, and array[0] is undefined. One is where the difference between the first and last element disappears, so code that mishandles one of them looks fine. Two is the smallest case where order matters and where a loop runs more than once. Many is the case you already thought about.
Boundaries are the same idea applied to numbers. If a condition says > limit, the interesting values are limit - 1, limit, and limit + 1 — and a suite that tests 0 and 100 has not been anywhere near it.
1 of 5