AbstractXClock implements XClock<F> { @Override public void setTime( final XTime<F> time) { LOGGER.trace("begin {}.setTime({})", new Object[] { getClass().getSimpleName(), time }); _timeLock.lock(); try { _time = new SimpleXTime<F>(time.getTick(), time.getPhase()); LOGGER.trace("end {}.setTime()", getClass().getSimpleName()); } finally { _timeLock.unlock(); } } protected  AbstractXClock(
            final long tick,
            final F phase,
            final F[] allPhases); protected  AbstractXClock(
            final F[] allPhases); @Override final XTime<F> getTime(); @Override final XTime<F> increment(); @Override void setTime(
            final XTime<F> time); @Override final int compareTo(
            final XClock<F> other); @Override final boolean equals(
            final Object obj); @Override final int hashCode(); @Override final String toString();  }
@Test(expectedExceptions = IllegalArgumentException.class) public final void setTimeOnBadTimeDoesNothing(){ final AbstractXClock<PhaseImpl> CLOCK = new AbstractXClockImpl(PhaseImpl.values()); final XTime<PhaseImpl> NEW_TIME = new XTime<PhaseImpl>(){ @Override public PhaseImpl getPhase() {return null;} @Override public long getTick() {return 0;} @Override public int compareTo(XTime<PhaseImpl> o) {return 0;} }; CLOCK.setTime(NEW_TIME); }