@@ -342,6 +342,103 @@ public void testReverseIndexed() {
342342 testReverse (new int [] {-1 , 1 , -2 , 2 }, 1 , 3 , new int [] {-1 , -2 , 1 , 2 });
343343 }
344344
345+ private static void testRotate (int [] input , int distance , int [] expectedOutput ) {
346+ input = Arrays .copyOf (input , input .length );
347+ Ints .rotate (input , distance );
348+ assertThat (input ).isEqualTo (expectedOutput );
349+ }
350+
351+ private static void testRotate (
352+ int [] input , int distance , int fromIndex , int toIndex , int [] expectedOutput ) {
353+ input = Arrays .copyOf (input , input .length );
354+ Ints .rotate (input , distance , fromIndex , toIndex );
355+ assertThat (input ).isEqualTo (expectedOutput );
356+ }
357+
358+ public void testRotate () {
359+ testRotate (new int [] {}, -1 , new int [] {});
360+ testRotate (new int [] {}, 0 , new int [] {});
361+ testRotate (new int [] {}, 1 , new int [] {});
362+
363+ testRotate (new int [] {1 }, -2 , new int [] {1 });
364+ testRotate (new int [] {1 }, -1 , new int [] {1 });
365+ testRotate (new int [] {1 }, 0 , new int [] {1 });
366+ testRotate (new int [] {1 }, 1 , new int [] {1 });
367+ testRotate (new int [] {1 }, 2 , new int [] {1 });
368+
369+ testRotate (new int [] {1 , 2 }, -3 , new int [] {2 , 1 });
370+ testRotate (new int [] {1 , 2 }, -1 , new int [] {2 , 1 });
371+ testRotate (new int [] {1 , 2 }, -2 , new int [] {1 , 2 });
372+ testRotate (new int [] {1 , 2 }, 0 , new int [] {1 , 2 });
373+ testRotate (new int [] {1 , 2 }, 1 , new int [] {2 , 1 });
374+ testRotate (new int [] {1 , 2 }, 2 , new int [] {1 , 2 });
375+ testRotate (new int [] {1 , 2 }, 3 , new int [] {2 , 1 });
376+
377+ testRotate (new int [] {1 , 2 , 3 }, -5 , new int [] {3 , 1 , 2 });
378+ testRotate (new int [] {1 , 2 , 3 }, -4 , new int [] {2 , 3 , 1 });
379+ testRotate (new int [] {1 , 2 , 3 }, -3 , new int [] {1 , 2 , 3 });
380+ testRotate (new int [] {1 , 2 , 3 }, -2 , new int [] {3 , 1 , 2 });
381+ testRotate (new int [] {1 , 2 , 3 }, -1 , new int [] {2 , 3 , 1 });
382+ testRotate (new int [] {1 , 2 , 3 }, 0 , new int [] {1 , 2 , 3 });
383+ testRotate (new int [] {1 , 2 , 3 }, 1 , new int [] {3 , 1 , 2 });
384+ testRotate (new int [] {1 , 2 , 3 }, 2 , new int [] {2 , 3 , 1 });
385+ testRotate (new int [] {1 , 2 , 3 }, 3 , new int [] {1 , 2 , 3 });
386+ testRotate (new int [] {1 , 2 , 3 }, 4 , new int [] {3 , 1 , 2 });
387+ testRotate (new int [] {1 , 2 , 3 }, 5 , new int [] {2 , 3 , 1 });
388+
389+ testRotate (new int [] {1 , 2 , 3 , 4 }, -9 , new int [] {2 , 3 , 4 , 1 });
390+ testRotate (new int [] {1 , 2 , 3 , 4 }, -5 , new int [] {2 , 3 , 4 , 1 });
391+ testRotate (new int [] {1 , 2 , 3 , 4 }, -1 , new int [] {2 , 3 , 4 , 1 });
392+ testRotate (new int [] {1 , 2 , 3 , 4 }, 0 , new int [] {1 , 2 , 3 , 4 });
393+ testRotate (new int [] {1 , 2 , 3 , 4 }, 1 , new int [] {4 , 1 , 2 , 3 });
394+ testRotate (new int [] {1 , 2 , 3 , 4 }, 5 , new int [] {4 , 1 , 2 , 3 });
395+ testRotate (new int [] {1 , 2 , 3 , 4 }, 9 , new int [] {4 , 1 , 2 , 3 });
396+
397+ testRotate (new int [] {1 , 2 , 3 , 4 , 5 }, -6 , new int [] {2 , 3 , 4 , 5 , 1 });
398+ testRotate (new int [] {1 , 2 , 3 , 4 , 5 }, -4 , new int [] {5 , 1 , 2 , 3 , 4 });
399+ testRotate (new int [] {1 , 2 , 3 , 4 , 5 }, -3 , new int [] {4 , 5 , 1 , 2 , 3 });
400+ testRotate (new int [] {1 , 2 , 3 , 4 , 5 }, -1 , new int [] {2 , 3 , 4 , 5 , 1 });
401+ testRotate (new int [] {1 , 2 , 3 , 4 , 5 }, 0 , new int [] {1 , 2 , 3 , 4 , 5 });
402+ testRotate (new int [] {1 , 2 , 3 , 4 , 5 }, 1 , new int [] {5 , 1 , 2 , 3 , 4 });
403+ testRotate (new int [] {1 , 2 , 3 , 4 , 5 }, 3 , new int [] {3 , 4 , 5 , 1 , 2 });
404+ testRotate (new int [] {1 , 2 , 3 , 4 , 5 }, 4 , new int [] {2 , 3 , 4 , 5 , 1 });
405+ testRotate (new int [] {1 , 2 , 3 , 4 , 5 }, 6 , new int [] {5 , 1 , 2 , 3 , 4 });
406+ }
407+
408+ public void testRotateIndexed () {
409+ testRotate (new int [] {}, 0 , 0 , 0 , new int [] {});
410+
411+ testRotate (new int [] {1 }, 0 , 0 , 1 , new int [] {1 });
412+ testRotate (new int [] {1 }, 1 , 0 , 1 , new int [] {1 });
413+ testRotate (new int [] {1 }, 1 , 1 , 1 , new int [] {1 });
414+
415+ // Rotate the central 5 elements, leaving the ends as-is
416+ testRotate (new int [] {0 , 1 , 2 , 3 , 4 , 5 , 6 }, -6 , 1 , 6 , new int [] {0 , 2 , 3 , 4 , 5 , 1 , 6 });
417+ testRotate (new int [] {0 , 1 , 2 , 3 , 4 , 5 , 6 }, -1 , 1 , 6 , new int [] {0 , 2 , 3 , 4 , 5 , 1 , 6 });
418+ testRotate (new int [] {0 , 1 , 2 , 3 , 4 , 5 , 6 }, 0 , 1 , 6 , new int [] {0 , 1 , 2 , 3 , 4 , 5 , 6 });
419+ testRotate (new int [] {0 , 1 , 2 , 3 , 4 , 5 , 6 }, 5 , 1 , 6 , new int [] {0 , 1 , 2 , 3 , 4 , 5 , 6 });
420+ testRotate (new int [] {0 , 1 , 2 , 3 , 4 , 5 , 6 }, 14 , 1 , 6 , new int [] {0 , 2 , 3 , 4 , 5 , 1 , 6 });
421+
422+ // Rotate the first three elements
423+ testRotate (new int [] {0 , 1 , 2 , 3 , 4 , 5 , 6 }, -2 , 0 , 3 , new int [] {2 , 0 , 1 , 3 , 4 , 5 , 6 });
424+ testRotate (new int [] {0 , 1 , 2 , 3 , 4 , 5 , 6 }, -1 , 0 , 3 , new int [] {1 , 2 , 0 , 3 , 4 , 5 , 6 });
425+ testRotate (new int [] {0 , 1 , 2 , 3 , 4 , 5 , 6 }, 0 , 0 , 3 , new int [] {0 , 1 , 2 , 3 , 4 , 5 , 6 });
426+ testRotate (new int [] {0 , 1 , 2 , 3 , 4 , 5 , 6 }, 1 , 0 , 3 , new int [] {2 , 0 , 1 , 3 , 4 , 5 , 6 });
427+ testRotate (new int [] {0 , 1 , 2 , 3 , 4 , 5 , 6 }, 2 , 0 , 3 , new int [] {1 , 2 , 0 , 3 , 4 , 5 , 6 });
428+
429+ // Rotate the last four elements
430+ testRotate (new int [] {0 , 1 , 2 , 3 , 4 , 5 , 6 }, -6 , 3 , 7 , new int [] {0 , 1 , 2 , 5 , 6 , 3 , 4 });
431+ testRotate (new int [] {0 , 1 , 2 , 3 , 4 , 5 , 6 }, -5 , 3 , 7 , new int [] {0 , 1 , 2 , 4 , 5 , 6 , 3 });
432+ testRotate (new int [] {0 , 1 , 2 , 3 , 4 , 5 , 6 }, -4 , 3 , 7 , new int [] {0 , 1 , 2 , 3 , 4 , 5 , 6 });
433+ testRotate (new int [] {0 , 1 , 2 , 3 , 4 , 5 , 6 }, -3 , 3 , 7 , new int [] {0 , 1 , 2 , 6 , 3 , 4 , 5 });
434+ testRotate (new int [] {0 , 1 , 2 , 3 , 4 , 5 , 6 }, -2 , 3 , 7 , new int [] {0 , 1 , 2 , 5 , 6 , 3 , 4 });
435+ testRotate (new int [] {0 , 1 , 2 , 3 , 4 , 5 , 6 }, -1 , 3 , 7 , new int [] {0 , 1 , 2 , 4 , 5 , 6 , 3 });
436+ testRotate (new int [] {0 , 1 , 2 , 3 , 4 , 5 , 6 }, 0 , 3 , 7 , new int [] {0 , 1 , 2 , 3 , 4 , 5 , 6 });
437+ testRotate (new int [] {0 , 1 , 2 , 3 , 4 , 5 , 6 }, 1 , 3 , 7 , new int [] {0 , 1 , 2 , 6 , 3 , 4 , 5 });
438+ testRotate (new int [] {0 , 1 , 2 , 3 , 4 , 5 , 6 }, 2 , 3 , 7 , new int [] {0 , 1 , 2 , 5 , 6 , 3 , 4 });
439+ testRotate (new int [] {0 , 1 , 2 , 3 , 4 , 5 , 6 }, 3 , 3 , 7 , new int [] {0 , 1 , 2 , 4 , 5 , 6 , 3 });
440+ }
441+
345442 public void testSortDescending () {
346443 testSortDescending (new int [] {}, new int [] {});
347444 testSortDescending (new int [] {1 }, new int [] {1 });
0 commit comments