Files
new-shapes/src/test/java/ovh/gasser/newshapes/SelectionTest.java
Thibaud ba37b199de fix(html): fix hashCode for triangle
The bug caused HTML class and CSS selector to have different IDs, breaking triangle rendering.
2026-03-27 16:39:10 +01:00

145 lines
4.6 KiB
Java

package ovh.gasser.newshapes;
import org.junit.jupiter.api.Test;
import ovh.gasser.newshapes.attributes.SelectionAttributes;
import ovh.gasser.newshapes.shapes.SCircle;
import ovh.gasser.newshapes.shapes.SRectangle;
import ovh.gasser.newshapes.shapes.STriangle;
import ovh.gasser.newshapes.ui.listeners.SelectionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import static org.junit.jupiter.api.Assertions.*;
class SelectionTest {
@Test
void testIsEmptyInitially() {
Selection selection = new Selection();
assertTrue(selection.isEmpty());
}
@Test
void testAdd() {
Selection selection = new Selection();
SCircle circle = SCircle.create(0, 0, 50);
selection.add(circle);
assertFalse(selection.isEmpty());
assertEquals(1, selection.getSelectedShapes().size());
assertTrue(selection.getSelectedShapes().contains(circle));
// Verify shape is marked as selected
SelectionAttributes attrs = (SelectionAttributes) circle.getAttributes(SelectionAttributes.ID);
assertNotNull(attrs);
assertTrue(attrs.selected);
}
@Test
void testAddAll() {
Selection selection = new Selection();
SCircle circle1 = SCircle.create(0, 0, 50);
SRectangle rect = SRectangle.create(10, 10, 100, 50);
STriangle triangle = STriangle.create(50, 50, 30, java.awt.Color.BLACK, java.awt.Color.BLACK);
List<ovh.gasser.newshapes.shapes.Shape> shapes = Arrays.asList(circle1, rect, triangle);
selection.addAll(shapes);
assertEquals(3, selection.getSelectedShapes().size());
assertTrue(selection.getSelectedShapes().contains(circle1));
assertTrue(selection.getSelectedShapes().contains(rect));
assertTrue(selection.getSelectedShapes().contains(triangle));
}
@Test
void testClear() {
Selection selection = new Selection();
SCircle circle = SCircle.create(0, 0, 50);
SRectangle rect = SRectangle.create(10, 10, 100, 50);
selection.add(circle);
selection.add(rect);
assertFalse(selection.isEmpty());
assertEquals(2, selection.getSelectedShapes().size());
selection.clear();
assertTrue(selection.isEmpty());
assertEquals(0, selection.getSelectedShapes().size());
// Verify shapes are marked as unselected
SelectionAttributes circleAttrs = (SelectionAttributes) circle.getAttributes(SelectionAttributes.ID);
SelectionAttributes rectAttrs = (SelectionAttributes) rect.getAttributes(SelectionAttributes.ID);
assertNotNull(circleAttrs);
assertNotNull(rectAttrs);
assertFalse(circleAttrs.selected);
assertFalse(rectAttrs.selected);
}
@Test
void testGetSelectedShapesReturnsCopy() {
Selection selection = new Selection();
SCircle circle = SCircle.create(0, 0, 50);
selection.add(circle);
List<ovh.gasser.newshapes.shapes.Shape> copy = selection.getSelectedShapes();
// Try to modify the copy
assertThrows(UnsupportedOperationException.class, () -> copy.add(SCircle.create(10, 10, 20)));
// Original should be unchanged
assertEquals(1, selection.getSelectedShapes().size());
}
@Test
void testAddListener() {
Selection selection = new Selection();
AtomicBoolean listenerNotified = new AtomicBoolean(false);
AtomicInteger notificationCount = new AtomicInteger(0);
SelectionListener listener = (selectedShapes) -> {
listenerNotified.set(true);
notificationCount.incrementAndGet();
};
selection.addListener(listener);
// Adding a shape should notify listener
SCircle circle = SCircle.create(0, 0, 50);
selection.add(circle);
assertTrue(listenerNotified.get());
assertEquals(1, notificationCount.get());
// Adding another shape should notify listener again
SRectangle rect = SRectangle.create(10, 10, 100, 50);
selection.add(rect);
assertEquals(2, notificationCount.get());
// Clearing should notify listener
selection.clear();
assertEquals(3, notificationCount.get());
}
@Test
void testNullAddAllDoesNothing() {
Selection selection = new Selection();
// Should not throw
assertDoesNotThrow(() -> selection.addAll(null));
// Selection should still be empty
assertTrue(selection.isEmpty());
}
}