package net.astropenguin.loopdeck; import java.util.*; import java.util.concurrent.*; public final class GaplessTest { private static void expect(boolean value) { if (!value) throw new AssertionError(); } private static final class Source implements PcmPrebuffer.Reader { int position, calls; final int frames; Source(int frames) { this.frames=frames; } public int read(float[] output,int requested) { calls++; int n=Math.min(Math.min(requested,37),frames-position); for (int i=0;i false); int calls=source.calls, expected=0; float[] block=new float[202]; Random random=new Random(1); while (true) { int n=buffer.read(block,1+random.nextInt(101)); if (n==0) break; for (int i=0;i true); expect(source.calls==0); PrefetchSlot slot=new PrefetchSlot<>(); Resource result=new Resource(); slot.offer(result); expect(slot.take()==result); slot.cancel(); expect(result.closed==0); result.close(); slot=new PrefetchSlot<>(); result=new Resource(); slot.offer(result); slot.cancel(); slot.cancel(); expect(result.closed==1); slot=new PrefetchSlot<>(); slot.cancel(); result=new Resource(); slot.offer(result); expect(result.closed==1 && slot.take()==null); for (int i=0;i<200;i++) { final PrefetchSlot race=new PrefetchSlot<>(); final Resource resource=new Resource(); CountDownLatch start=new CountDownLatch(1); Thread producer=new Thread(() -> { try { start.await(); race.offer(resource); } catch (InterruptedException e) { throw new AssertionError(e); } }); producer.start(); start.countDown(); race.cancel(); producer.join(); expect(resource.closed==1); } System.out.println("Gapless PCM continuity, boundaries, cancellation and ownership passed"); } }