package evolutionAlgorithm;

import org.junit.jupiter.api.Test;
import sk.shanki.dbsuite.mapper.TableRowsMapping;
import sk.shanki.dbsuite.mapper.db.Row;
import sk.shanki.dbsuite.mapper.evolutionAlgorithm.Individual;
import sk.shanki.dbsuite.mapper.values.DbString;

import java.util.*;

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

public class MutationTest {

    @Test
    public void testMutation() {
        Row row1 = new Row(DbString.instanceFor("Jozko"));
        Row mapped_row1 = new Row(DbString.instanceFor("Jozko"));
        Row row2 = new Row(DbString.instanceFor("Ferko"));
        Row mapped_row2 = new Row(DbString.instanceFor("Ferko"));

        TableRowsMapping table = new TableRowsMapping(new ArrayList<>());
        table.put(row1, mapped_row1);
        table.put(row2, mapped_row2);
        row1.mapTo(mapped_row1);
        mapped_row1.mapTo(row1);
        row2.mapTo(mapped_row2);
        mapped_row2.mapTo(row2);


        Individual individual = new Individual(Arrays.asList(table));
        individual.mutate(row1, row2, table.map);

        assertEquals(row1.getMappedTo(), mapped_row2);
        assertEquals(row2.getMappedTo(), mapped_row1);
        assertEquals(mapped_row1.getMappedTo(), row2);
        assertEquals(mapped_row2.getMappedTo(), row1);
    }

    @Test
    public void testMutationWithNull() {

        Row row1 = new Row(DbString.instanceFor("Jozko"));
        Row mapped_row1 = new Row(DbString.instanceFor("Jozko"));
        Row row2 = new Row(DbString.instanceFor("Ferko"));

        TableRowsMapping table = new TableRowsMapping(new ArrayList<>());
        table.put(row1, mapped_row1);
        table.put(row2, null);
        row1.mapTo(mapped_row1);
        row2.mapTo(null);


        Individual individual = new Individual(List.of(table));
        individual.mutate(row1, row2, table.map);

        assertNull(row1.getMappedTo());
        assertEquals(row2.getMappedTo(), mapped_row1);
        assertEquals(mapped_row1.getMappedTo(), row2);

    }
}