// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.tools;
import static org.junit.Assert.assertEquals;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.openstreetmap.josm.testutils.JOSMTestRules;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
/**
* Test {@link MultiLineFlowLayout}
* @author Michael Zangl
*/
public class MultiLineFlowLayoutTest {
/**
* No special rules.
*/
@Rule
@SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
public JOSMTestRules test = new JOSMTestRules();
private static final int TEST_WIDHT = 500;
private JPanel container;
/**
* Prepare test container.
*/
@Before
public void setUp() {
JPanel parent = new JPanel();
parent.setBounds(0, 0, TEST_WIDHT, 500);
container = new JPanel(new MultiLineFlowLayout(FlowLayout.CENTER, 0, 0));
parent.add(container);
}
/**
* Test that one line is layed out correctly
*/
@Test
public void testOneLine() {
fillOneLine();
container.invalidate();
Dimension preffered = container.getPreferredSize();
assertEquals(TEST_WIDHT, preffered.width);
assertEquals(100, preffered.height);
Dimension minimum = container.getMinimumSize();
assertEquals(TEST_WIDHT, minimum.width);
assertEquals(50, minimum.height);
}
/**
* Test that insets are respected
*/
@Test
public void testInsets() {
fillOneLine();
container.setBorder(BorderFactory.createEmptyBorder(3, 0, 7, 0));
container.invalidate();
Dimension preffered = container.getPreferredSize();
assertEquals(TEST_WIDHT, preffered.width);
assertEquals(110, preffered.height);
// This should force wrapping
container.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 40));
container.invalidate();
preffered = container.getPreferredSize();
assertEquals(TEST_WIDHT, preffered.width);
assertEquals(200, preffered.height);
}
/**
* Test that gaps are respected
*/
@Test
public void testGaps() {
fillOneLine();
container.setLayout(new MultiLineFlowLayout(FlowLayout.LEADING, 20, 10));
container.invalidate();
Dimension preffered = container.getPreferredSize();
assertEquals(TEST_WIDHT, preffered.width);
assertEquals(230, preffered.height);
}
/**
* Test that it behaves the same as FlowLayout for one line.
*/
@Test
public void testSameAsFlowLayout() {
fillOneLine();
JPanel childx = new JPanel();
childx.setPreferredSize(new Dimension(300, 100));
childx.setMinimumSize(new Dimension(200, 50));
childx.setVisible(false);
container.add(childx);
container.setBorder(BorderFactory.createEmptyBorder(3, 4, 5, 6));
container.setLayout(new MultiLineFlowLayout(FlowLayout.LEADING, 2, 1));
container.invalidate();
Dimension is = container.getPreferredSize();
container.setLayout(new FlowLayout(FlowLayout.LEADING, 2, 1));
container.invalidate();
Dimension should = container.getPreferredSize();
assertEquals(should.height, is.height);
}
private void fillOneLine() {
JPanel child1 = new JPanel();
child1.setPreferredSize(new Dimension(300, 100));
child1.setMinimumSize(new Dimension(200, 50));
container.add(child1);
JPanel child2 = new JPanel();
child2.setPreferredSize(new Dimension(100, 100));
child1.setMinimumSize(new Dimension(100, 50));
container.add(child2);
JPanel child3 = new JPanel();
child3.setPreferredSize(new Dimension(50, 100));
child1.setMinimumSize(new Dimension(50, 50));
container.add(child3);
}
}