Files
allwpilib/wpilibj/src/test/java/org/wpilib/event/EventLoopTest.java
2025-11-07 23:09:21 -08:00

93 lines
2.2 KiB
Java

// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
package org.wpilib.event;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import java.util.ConcurrentModificationException;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import org.junit.jupiter.api.Test;
class EventLoopTest {
@Test
void testConditions() {
var counterTrue = new AtomicInteger(0);
var counterFalse = new AtomicInteger(0);
var loop = new EventLoop();
new BooleanEvent(loop, () -> true).ifHigh(counterTrue::incrementAndGet);
new BooleanEvent(loop, () -> false).ifHigh(counterFalse::incrementAndGet);
assertEquals(0, counterTrue.get());
assertEquals(0, counterFalse.get());
loop.poll();
assertEquals(1, counterTrue.get());
assertEquals(0, counterFalse.get());
loop.poll();
assertEquals(2, counterTrue.get());
assertEquals(0, counterFalse.get());
}
@Test
void testClear() {
var condition = new AtomicBoolean(false);
var counter = new AtomicInteger(0);
var loop = new EventLoop();
// first ensure binding works
new BooleanEvent(loop, condition::get).ifHigh(counter::incrementAndGet);
condition.set(false);
loop.poll();
assertEquals(0, counter.get());
condition.set(true);
loop.poll();
assertEquals(1, counter.get());
// clear bindings
loop.clear();
condition.set(true);
loop.poll();
// shouldn't change
assertEquals(1, counter.get());
}
@Test
void testConcurrentModification() {
var loop = new EventLoop();
loop.bind(
() -> {
assertThrows(
ConcurrentModificationException.class,
() -> {
loop.bind(() -> {});
});
});
loop.poll();
loop.clear();
loop.bind(
() -> {
assertThrows(
ConcurrentModificationException.class,
() -> {
loop.clear();
});
});
loop.poll();
}
}