public void testStyleChanged() {
    final Style[] changed = new Style[1];
    doc =
        new DefaultStyledDocument() {
          private static final long serialVersionUID = 1L;

          @Override
          protected void styleChanged(final Style style) {
            changed[0] = style;
            super.styleChanged(style);
          }
        };
    styles = (StyleContext) doc.getAttributeContext();
    final NamedStyle aStyle = (NamedStyle) doc.addStyle(STYLE_NAME, null);
    assertEquals(0, styles.getChangeListeners().length);
    assertEquals(0, aStyle.listenerList.getListenerCount());
    final DocumentListener listener =
        new DocumentListener() {
          public void insertUpdate(DocumentEvent e) {}

          public void removeUpdate(DocumentEvent e) {}

          public void changedUpdate(DocumentEvent e) {}
        };
    doc.addDocumentListener(listener);
    assertEquals(1, styles.getChangeListeners().length);
    assertEquals(1, aStyle.listenerList.getListenerCount());
    final NamedStyle anotherStyle = (NamedStyle) styles.addStyle("otherStyle", aStyle);
    assertEquals(1, anotherStyle.listenerList.getListenerCount());
    final NamedStyle nullStyle = (NamedStyle) styles.addStyle(null, null);
    assertEquals(0, nullStyle.listenerList.getListenerCount());
    assertNull(changed[0]);
    aStyle.addAttribute("key", "value");
    assertSame(aStyle, changed[0]);
    doc.removeDocumentListener(listener);
    assertEquals(0, styles.getChangeListeners().length);
    assertEquals(0, aStyle.listenerList.getListenerCount());
    assertEquals(0, anotherStyle.listenerList.getListenerCount());
  }