/** * @PROJECT.FULLNAME@ @VERSION@ License. * * Copyright @YEAR@ L2FProd.com * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jdesktop.swingx; import java.util.Properties; import javax.swing.JTree; import junit.framework.TestCase; import org.jdesktop.swingx.icon.EmptyIcon; import org.jdesktop.swingx.tips.DefaultTip; import org.jdesktop.swingx.tips.DefaultTipOfTheDayModel; import org.jdesktop.swingx.tips.TipLoader; import org.jdesktop.swingx.tips.TipOfTheDayModel; import org.jdesktop.test.PropertyChangeReport; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @RunWith(JUnit4.class) public class JXTipOfTheDayTest extends TestCase { @Test public void testBean() { PropertyChangeReport report = new PropertyChangeReport(); JXTipOfTheDay totd = new JXTipOfTheDay(); assertEquals(0, totd.getCurrentTip()); // with an empty model next/previous are no-op totd.nextTip(); totd.previousTip(); assertFalse(report.hasEvents(JXTipOfTheDay.CURRENT_TIP_CHANGED_KEY)); totd.addPropertyChangeListener(report); DefaultTipOfTheDayModel model = new DefaultTipOfTheDayModel(); model.add(new DefaultTip("name1", "description1")); model.add(new DefaultTip("name2", "<html>description2")); model.add(new DefaultTip("name3", new EmptyIcon())); model.add(new DefaultTip("name3", new JTree())); totd.setModel(model); assertTrue(report.hasEvents("model")); assertFalse(report.hasEvents(JXTipOfTheDay.CURRENT_TIP_CHANGED_KEY)); assertEquals(0, totd.getCurrentTip()); totd.nextTip(); assertTrue(report.hasEvents(JXTipOfTheDay.CURRENT_TIP_CHANGED_KEY)); assertEquals(1, totd.getCurrentTip()); totd.nextTip(); assertEquals(2, totd.getCurrentTip()); totd.nextTip(); assertEquals(3, totd.getCurrentTip()); // tips cycle when bounds are reached totd.nextTip(); assertEquals(0, totd.getCurrentTip()); totd.previousTip(); assertEquals(3, totd.getCurrentTip()); // do not accept to go outside of tip count bounds try { totd.setCurrentTip(-1); fail("Negative tip!"); } catch (IllegalArgumentException e) { } try { totd.setCurrentTip(totd.getModel().getTipCount()); fail("Over the limit!"); } catch (IllegalArgumentException e) { } // do not accept null model try { totd.setModel(null); fail("Should not reach this code"); } catch (IllegalArgumentException e) { } DefaultTip tip = new DefaultTip(); assertNull(tip.getTip()); assertNull(tip.getTipName()); tip.setTipName("name"); assertEquals("name", tip.getTipName()); tip.setTip("tip"); assertEquals("tip", tip.getTip()); assertEquals(tip.getTipName(), tip.toString()); } @Test public void testTipLoader() { TipOfTheDayModel model; Properties props = new Properties(); // empty properties create empty model model = TipLoader.load(props); assertEquals(0, model.getTipCount()); // one tip with name and description props.put("tip.1.name", "name1"); props.put("tip.1.description", "description1"); model = TipLoader.load(props); assertEquals(1, model.getTipCount()); assertEquals("name1", model.getTipAt(0).getTipName()); assertEquals("description1", model.getTipAt(0).getTip()); // one tip with description only (name is optional) props.put("tip.2.description", "description2"); model = TipLoader.load(props); assertEquals(2, model.getTipCount()); assertEquals("name1", model.getTipAt(0).getTipName()); assertEquals("description1", model.getTipAt(0).getTip()); assertNull(model.getTipAt(1).getTipName()); assertEquals("description2", model.getTipAt(1).getTip()); // one tip with name only, but description is mandatory! props.put("tip.3.name", "name3"); try { model = TipLoader.load(props); assertTrue("Must not get here", false); } catch (IllegalArgumentException e) { // expected } // one missing number in the tip sequence props.put("tip.3.description", "desc3"); props.put("tip.5.description", "desc5"); model = TipLoader.load(props); assertEquals(3, model.getTipCount()); } @Test public void testAddon() throws Exception { // move around all addons TestUtilities.cycleAddons(new JXTipOfTheDay()); } @Test public void testChoice() throws Exception { JXTipOfTheDay.ShowOnStartupChoice noshow = new JXTipOfTheDay.ShowOnStartupChoice() { public boolean isShowingOnStartup() { return false; } public void setShowingOnStartup(boolean showOnStartup) { } }; JXTipOfTheDay totd = new JXTipOfTheDay(); assertFalse(totd.showDialog(null, noshow)); } }