@@ -0,0 +1,2425 @@
+package io.github.xxyy.quietcord.filter;%0A%0Aimport org.junit.Test;%0A%0Aimport java.util.logging.Filter;%0Aimport java.util.logging.Level;%0Aimport java.util.logging.LogRecord;%0Aimport java.util.logging.Logger;%0A%0Aimport static org.hamcrest.CoreMatchers.is;%0Aimport static org.junit.Assert.assertThat;%0A%0Apublic class PropagatingFilterTest %7B%0A%0A    public static final String ARBITRARY_TEXT = %22arbitrary text%22;%0A    public static final String IGNORED_BY_A = %22ignored by A%22;%0A    public static final String IGNORED_BY_B = %22ignored by B%22;%0A%0A    @Test%0A    public void testInject__alone() throws Exception %7B%0A        Logger logger = Logger.getLogger(%22testing%22);%0A%0A        new PropagatingFilterA(logger).inject();%0A%0A        Filter injected = logger.getFilter();%0A%0A        assertThat(%22filter wrongly matched arbitrary message alone%22,%0A                injected.isLoggable(rec(ARBITRARY_TEXT)), is(true));%0A%0A        assertThat(%22filter A didn't match ignored message alone%22,%0A                injected.isLoggable(rec(IGNORED_BY_A)), is(false));%0A    %7D%0A%0A    @Test%0A    public void testInject__multiple() throws Exception %7B%0A        Logger logger = Logger.getLogger(%22testing%22);%0A%0A        new PropagatingFilterA(logger).inject();%0A        new PropagatingFilterB(logger).inject();%0A%0A        Filter injected = logger.getFilter();%0A%0A        assertThat(%22filter wrongly matched arbitrary message multiple%22,%0A                injected.isLoggable(rec(ARBITRARY_TEXT)), is(true));%0A%0A        assertThat(%22filter didn't match ignored message A multiple%22,%0A                injected.isLoggable(rec(IGNORED_BY_A)), is(false));%0A%0A        assertThat(%22filter didn't match ignored message B multiple%22,%0A                injected.isLoggable(rec(IGNORED_BY_B)), is(false));%0A    %7D%0A%0A    private LogRecord rec(String message) %7B%0A        return new LogRecord(Level.INFO, message);%0A    %7D%0A%0A    private class PropagatingFilterA extends PropagatingFilter %7B%0A        protected PropagatingFilterA(Logger logger) %7B%0A            super(logger);%0A        %7D%0A%0A        @Override%0A        public boolean isLoggable(LogRecord record) %7B%0A            return !record.getMessage().equals(IGNORED_BY_A);%0A        %7D%0A    %7D%0A%0A    private class PropagatingFilterB extends PropagatingFilter %7B%0A        protected PropagatingFilterB(Logger logger) %7B%0A            super(logger);%0A        %7D%0A%0A        @Override%0A        public boolean isLoggable(LogRecord record) %7B%0A            return !record.getMessage().equals(IGNORED_BY_B);%0A        %7D%0A    %7D%0A%7D%0A

Add some tests for compound filter mechanics