package com.thealgorithms.others;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;

import org.junit.jupiter.api.Test;

public class TwoPointersTest {

    @Test
    void testPositivePairExists() {
        int[] arr = {2, 6, 9, 22, 121};
        int key = 28;
        assertTrue(TwoPointers.isPairedSum(arr, key));
    }

    @Test
    void testNegativePairExists() {
        int[] arr = {-12, -1, 0, 8, 12};
        int key = 0;
        assertTrue(TwoPointers.isPairedSum(arr, key));
    }

    @Test
    void testPairDoesNotExist() {
        int[] arr = {0, 12, 12, 35, 152};
        int key = 13;
        assertFalse(TwoPointers.isPairedSum(arr, key));
    }

    @Test
    void testNegativeSumPair() {
        int[] arr = {-10, -3, 1, 2, 5, 9};
        int key = -8;
        assertTrue(TwoPointers.isPairedSum(arr, key));
    }

    @Test
    void testPairDoesNotExistWithPositiveSum() {
        int[] arr = {1, 2, 3, 4, 5};
        int key = 10;
        assertFalse(TwoPointers.isPairedSum(arr, key));
    }

    @Test
    void testEmptyArray() {
        int[] arr = {};
        int key = 5;
        assertFalse(TwoPointers.isPairedSum(arr, key));
    }

    @Test
    void testSingleElementArray() {
        int[] arr = {5};
        int key = 5;
        assertFalse(TwoPointers.isPairedSum(arr, key));
    }

    @Test
    void testArrayWithDuplicateElements() {
        int[] arr = {1, 1, 3, 5, 5};
        int key = 6;
        assertTrue(TwoPointers.isPairedSum(arr, key));
    }

    @Test
    void testPairExistsAtEdges() {
        int[] arr = {1, 3, 4, 7, 8};
        int key = 9;
        assertTrue(TwoPointers.isPairedSum(arr, key));
    }

    @Test
    void isPairedSumShouldThrowExceptionWhenArrayIsNull() {
        IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> TwoPointers.isPairedSum(null, 10));
        assertEquals("Input array must not be null.", exception.getMessage());
    }
}
