import static org.junit.jupiter.api.Assertions.assertArrayEquals;

import org.junit.jupiter.api.Test;

public class TestNLargest
{
    @Test
    public void testWithTypical()
    {
        int[] nums1 = {71, 86, 79, 36, 78, 35, 75, 86, 24, 11};
        int[] nums2 = {37, 32, 70, 15, 93, 40, 63, 3, 40, 63};

        int[] nums1Original = nums1.clone();
        int[] nums2Original = nums2.clone();

        assertArrayEquals(new int[] {75, 78, 79, 86, 86}, NLargest.findNLargest(nums1, 5));
        assertArrayEquals(nums1Original, nums1);

        assertArrayEquals(new int[] {63, 70, 93}, NLargest.findNLargest(nums2, 3));
        assertArrayEquals(nums2Original, nums2);
    }

    @Test
    public void testWithLengthMatchingN()
    {
        int[] nums1 = {71, 86, 79, 36, 78, 35, 75, 86, 24, 11};
        int[] nums2 = {37, 32, 70, 15, 93, 40, 63, 3, 40, 63};

        int[] nums1Original = nums1.clone();
        int[] nums2Original = nums2.clone();

        assertArrayEquals(new int[] {11, 24, 35, 36, 71, 75, 78, 79, 86, 86}, NLargest.findNLargest(nums1, 10));
        assertArrayEquals(nums1Original, nums1);

        assertArrayEquals(new int[] {3, 15, 32, 37, 40, 40, 63, 63, 70, 93}, NLargest.findNLargest(nums2, 10));
        assertArrayEquals(nums2Original, nums2);
    }

    @Test
    public void testWithNZero()
    {
        int[] nums = {71, 86, 79, 36, 78, 35, 75, 86, 24, 11};
        int[] numsOriginal = nums.clone();

        assertArrayEquals(new int[] {}, NLargest.findNLargest(nums, 0));
        assertArrayEquals(numsOriginal, nums);
    }

    @Test
    public void testWithEmpty()
    {
        int[] nums = {};
        int[] numsOriginal = nums.clone();

        assertArrayEquals(new int[] {}, NLargest.findNLargest(nums, 0));
        assertArrayEquals(numsOriginal, nums);
    }
}
