diff --git a/pom.xml b/pom.xml
index f834374..ce6f11b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -54,5 +54,13 @@
3.3.3
natives-windows
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ 6.1.0-M1
+ test
+
\ No newline at end of file
diff --git a/readme.md b/readme.md
new file mode 100644
index 0000000..ba21665
--- /dev/null
+++ b/readme.md
@@ -0,0 +1,17 @@
+# SWT-CCTV
+
+A rather simple CCTV software which operates with Java.
+If you want to build this project on yourself, you will need IntelliJ (or any other IDE) and Maven!
+
+## Dependencies:
+- Webcam by Sarxos
+- SWT
+- _lwjgl (with opengl)_ → This is important for our goals of rendering on the GPU.
+- junit for testing stuff
+
+### Future Plans:
+They arent too big, i want one thing more and that is some more utilities in the camera window.
+Also some Network streaming but i am too lazy to do that
+
+### Author(s):
+- rattatwinko
\ No newline at end of file
diff --git a/src/test/java/AutoGainProcessorTest.java b/src/test/java/AutoGainProcessorTest.java
new file mode 100644
index 0000000..3bc4ab5
--- /dev/null
+++ b/src/test/java/AutoGainProcessorTest.java
@@ -0,0 +1,85 @@
+import io.swtc.proccessing.AutoGainProcessor;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+import java.util.Arrays;
+
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/*
+* This is a pure logic class so testing this will be fine, all other classes arent really logic classes, they handle more
+* of displaying stuff.
+* */
+
+class AutoGainProcessorTest {
+
+ private AutoGainProcessor processor;
+
+ @BeforeEach
+ void setUp() {
+ processor = new AutoGainProcessor();
+ }
+
+ @Test
+ @DisplayName("Return 1.0 gain for a gray image")
+ void testNeutralGray() {
+ // Create an array of 16 pixels, all middle gray (128, 128, 128)
+ // Hex: 0xFF808080 ; We ignore Alpha all together in our code. so yeah
+ int grayPixel = (255 << 24) | (128 << 16) | (128 << 8) | 128;
+ int[] pixels = new int[16];
+ Arrays.fill(pixels, grayPixel);
+
+ float[] gains = processor.calculateAutoGains(pixels);
+
+ // R, G, B should all be 1.0 because they are already equal to the average
+ assertArrayEquals(new float[]{1.0f, 1.0f, 1.0f}, gains, 0.001f);
+ }
+
+ @Test
+ @DisplayName("Should boost a weak color channel")
+ void testColorCorrection() {
+ /*
+ Create an image that is "too red"
+ Red = 200, Green = 100, Blue = 100
+ grayAvg = (200 + 100 + 100) / 3 = 133.33
+ Red gain = 133.33 / 200 = 0.66
+ Green gain = 133.33 / 100 = 1.33
+ */
+ int reddishPixel = (200 << 16) | (100 << 8) | 100;
+ int[] pixels = {reddishPixel, reddishPixel, reddishPixel, reddishPixel};
+
+ float[] gains = processor.calculateAutoGains(pixels);
+
+ assertTrue(gains[0] < 1.0f, "Red gain should decrease");
+ assertTrue(gains[1] > 1.0f, "Green gain should increase");
+ assertTrue(gains[2] > 1.0f, "Blue gain should increase");
+ }
+
+ @Test
+ @DisplayName("Cap max gain at 2.0")
+ void testGainCapping() {
+ // Extreme case, very little blue
+ // Red=100, Green=100, Blue=10
+ // grayAvg = 70. Blue gain would be 70/10 = 7.0, but should be capped at 2.0
+ int lowBluePixel = (100 << 16) | (100 << 8) | 10;
+ int[] pixels = new int[8];
+ for (int i = 0; i < 8; i++) pixels[i] = lowBluePixel;
+
+ float[] gains = processor.calculateAutoGains(pixels);
+
+ assertArrayEquals(new float[]{0.7f, 0.7f, 2.0f}, gains, 0.001f);
+ }
+
+ @Test
+ @DisplayName("Handle a empty / black image safely")
+ void testEmptyAndBlack() {
+ // Test empty array
+ assertArrayEquals(new float[]{1f, 1f, 1f}, processor.calculateAutoGains(new int[0]));
+
+ // Test total black (grayAvg will be 0)
+ int[] blackPixels = {0, 0, 0, 0};
+ assertArrayEquals(new float[]{1f, 1f, 1f}, processor.calculateAutoGains(blackPixels));
+ }
+}
\ No newline at end of file