package com.thealgorithms.dynamicprogramming;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;

import org.junit.jupiter.api.Test;

public class LongestCommonSubsequenceTest {

    @Test
    public void testLCSBasic() {
        String str1 = "ABCBDAB";
        String str2 = "BDCAB";
        String expected = "BDAB"; // The longest common subsequence
        String result = LongestCommonSubsequence.getLCS(str1, str2);
        assertEquals(expected, result);
    }

    @Test
    public void testLCSIdenticalStrings() {
        String str1 = "AGGTAB";
        String str2 = "AGGTAB";
        String expected = "AGGTAB"; // LCS is the same as the strings
        String result = LongestCommonSubsequence.getLCS(str1, str2);
        assertEquals(expected, result);
    }

    @Test
    public void testLCSNoCommonCharacters() {
        String str1 = "ABC";
        String str2 = "XYZ";
        String expected = ""; // No common subsequence
        String result = LongestCommonSubsequence.getLCS(str1, str2);
        assertEquals(expected, result);
    }

    @Test
    public void testLCSWithEmptyString() {
        String str1 = "";
        String str2 = "XYZ";
        String expected = ""; // LCS with an empty string should be empty
        String result = LongestCommonSubsequence.getLCS(str1, str2);
        assertEquals(expected, result);
    }

    @Test
    public void testLCSWithBothEmptyStrings() {
        String str1 = "";
        String str2 = "";
        String expected = ""; // LCS with both strings empty should be empty
        String result = LongestCommonSubsequence.getLCS(str1, str2);
        assertEquals(expected, result);
    }

    @Test
    public void testLCSWithNullFirstString() {
        String str1 = null;
        String str2 = "XYZ";
        String result = LongestCommonSubsequence.getLCS(str1, str2);
        assertNull(result);
    }

    @Test
    public void testLCSWithNullSecondString() {
        String str1 = "ABC";
        String str2 = null;
        String result = LongestCommonSubsequence.getLCS(str1, str2);
        assertNull(result);
    }

    @Test
    public void testLCSWithNullBothStrings() {
        String str1 = null;
        String str2 = null;
        String result = LongestCommonSubsequence.getLCS(str1, str2);
        assertNull(result);
    }

    @Test
    public void testLCSWithLongerStringContainingCommonSubsequence() {
        String str1 = "ABCDEF";
        String str2 = "AEBDF";
        String expected = "ABDF"; // Common subsequence is "ABDF"
        String result = LongestCommonSubsequence.getLCS(str1, str2);
        assertEquals(expected, result);
    }
}
