mirror of
https://github.com/TheAlgorithms/Java.git
synced 2025-12-19 07:00:35 +08:00
* feat: FloodFill Algorithm with iterative approach - nested class Point: helper class, represents point in 2D field (x,y) - shouldSkipPixel method: helper method to validate point - floodFill method: iterative version of floodFill, uses Queue to add and poll Points and change it color if allowed * feat: tests for IterativeFloodFill -same tests as for normal floodFill and test for a big image * docs: add link to floodFill algorithm * codeStyle fix * tests: add tests for edge cases * codeStyle fix * codeStyle fix * codeStyle fix * refactor: reorganize structure and add JavaDoc - Move private methods after public methods for better readability - Add class-level JavaDoc documentation with algorithm description and links to references
164 lines
4.4 KiB
Java
164 lines
4.4 KiB
Java
package com.thealgorithms.others;
|
|
|
|
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
|
|
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
|
|
|
|
import org.junit.jupiter.api.Test;
|
|
|
|
class IterativeFloodFillTest {
|
|
|
|
@Test
|
|
void testForEmptyImage() {
|
|
int[][] image = {};
|
|
int[][] expected = {};
|
|
|
|
IterativeFloodFill.floodFill(image, 4, 5, 3, 2);
|
|
assertArrayEquals(expected, image);
|
|
}
|
|
|
|
@Test
|
|
void testForSingleElementImage() {
|
|
int[][] image = {{1}};
|
|
int[][] expected = {{3}};
|
|
|
|
IterativeFloodFill.floodFill(image, 0, 0, 3, 1);
|
|
assertArrayEquals(expected, image);
|
|
}
|
|
|
|
@Test
|
|
void testForEmptyRow() {
|
|
int[][] image = {{}};
|
|
int[][] expected = {{}};
|
|
|
|
IterativeFloodFill.floodFill(image, 4, 5, 3, 2);
|
|
assertArrayEquals(expected, image);
|
|
}
|
|
|
|
@Test
|
|
void testForImageOne() {
|
|
int[][] image = {
|
|
{0, 0, 0, 0, 0, 0, 0},
|
|
{0, 3, 3, 3, 3, 0, 0},
|
|
{0, 3, 1, 1, 5, 0, 0},
|
|
{0, 3, 1, 1, 5, 5, 3},
|
|
{0, 3, 5, 5, 1, 1, 3},
|
|
{0, 0, 0, 5, 1, 1, 3},
|
|
{0, 0, 0, 3, 3, 3, 3},
|
|
};
|
|
|
|
int[][] expected = {
|
|
{0, 0, 0, 0, 0, 0, 0},
|
|
{0, 3, 3, 3, 3, 0, 0},
|
|
{0, 3, 2, 2, 5, 0, 0},
|
|
{0, 3, 2, 2, 5, 5, 3},
|
|
{0, 3, 5, 5, 2, 2, 3},
|
|
{0, 0, 0, 5, 2, 2, 3},
|
|
{0, 0, 0, 3, 3, 3, 3},
|
|
};
|
|
|
|
IterativeFloodFill.floodFill(image, 2, 2, 2, 1);
|
|
assertArrayEquals(expected, image);
|
|
}
|
|
|
|
@Test
|
|
void testForImageTwo() {
|
|
int[][] image = {
|
|
{0, 0, 1, 1, 0, 0, 0},
|
|
{1, 1, 3, 3, 3, 0, 0},
|
|
{1, 3, 1, 1, 5, 0, 0},
|
|
{0, 3, 1, 1, 5, 5, 3},
|
|
{0, 3, 5, 5, 1, 1, 3},
|
|
{0, 0, 0, 5, 1, 1, 3},
|
|
{0, 0, 0, 1, 3, 1, 3},
|
|
};
|
|
|
|
int[][] expected = {
|
|
{0, 0, 2, 2, 0, 0, 0},
|
|
{2, 2, 3, 3, 3, 0, 0},
|
|
{2, 3, 2, 2, 5, 0, 0},
|
|
{0, 3, 2, 2, 5, 5, 3},
|
|
{0, 3, 5, 5, 2, 2, 3},
|
|
{0, 0, 0, 5, 2, 2, 3},
|
|
{0, 0, 0, 2, 3, 2, 3},
|
|
};
|
|
|
|
IterativeFloodFill.floodFill(image, 2, 2, 2, 1);
|
|
assertArrayEquals(expected, image);
|
|
}
|
|
|
|
@Test
|
|
void testForImageThree() {
|
|
int[][] image = {
|
|
{1, 1, 2, 3, 1, 1, 1},
|
|
{1, 0, 0, 1, 0, 0, 1},
|
|
{1, 1, 1, 0, 3, 1, 2},
|
|
};
|
|
|
|
int[][] expected = {
|
|
{4, 4, 2, 3, 4, 4, 4},
|
|
{4, 0, 0, 4, 0, 0, 4},
|
|
{4, 4, 4, 0, 3, 4, 2},
|
|
};
|
|
|
|
IterativeFloodFill.floodFill(image, 0, 1, 4, 1);
|
|
assertArrayEquals(expected, image);
|
|
}
|
|
|
|
@Test
|
|
void testForSameNewAndOldColor() {
|
|
int[][] image = {{1, 1, 2}, {1, 0, 0}, {1, 1, 1}};
|
|
|
|
int[][] expected = {{1, 1, 2}, {1, 0, 0}, {1, 1, 1}};
|
|
|
|
IterativeFloodFill.floodFill(image, 0, 1, 1, 1);
|
|
assertArrayEquals(expected, image);
|
|
}
|
|
|
|
@Test
|
|
void testForBigImage() {
|
|
int[][] image = new int[100][100];
|
|
|
|
assertDoesNotThrow(() -> IterativeFloodFill.floodFill(image, 0, 0, 1, 0));
|
|
}
|
|
|
|
@Test
|
|
void testForBelowZeroX() {
|
|
int[][] image = {{1, 1, 2}, {1, 0, 0}, {1, 1, 1}};
|
|
|
|
int[][] expected = {{1, 1, 2}, {1, 0, 0}, {1, 1, 1}};
|
|
|
|
IterativeFloodFill.floodFill(image, -1, 1, 1, 0);
|
|
assertArrayEquals(expected, image);
|
|
}
|
|
|
|
@Test
|
|
void testForBelowZeroY() {
|
|
int[][] image = {{1, 1, 2}, {1, 0, 0}, {1, 1, 1}};
|
|
|
|
int[][] expected = {{1, 1, 2}, {1, 0, 0}, {1, 1, 1}};
|
|
|
|
IterativeFloodFill.floodFill(image, 1, -1, 1, 0);
|
|
assertArrayEquals(expected, image);
|
|
}
|
|
|
|
@Test
|
|
void testForAboveBoundaryX() {
|
|
int[][] image = {{1, 1, 2}, {1, 0, 0}, {1, 1, 1}};
|
|
|
|
int[][] expected = {{1, 1, 2}, {1, 0, 0}, {1, 1, 1}};
|
|
|
|
IterativeFloodFill.floodFill(image, 100, 1, 1, 0);
|
|
assertArrayEquals(expected, image);
|
|
}
|
|
|
|
@Test
|
|
void testForAboveBoundaryY() {
|
|
int[][] image = {{1, 1, 2}, {1, 0, 0}, {1, 1, 1}};
|
|
|
|
int[][] expected = {{1, 1, 2}, {1, 0, 0}, {1, 1, 1}};
|
|
|
|
IterativeFloodFill.floodFill(image, 1, 100, 1, 0);
|
|
assertArrayEquals(expected, image);
|
|
}
|
|
}
|