| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You 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. |
| */ |
| /** |
| * @author Alexey A. Ivanov |
| */ |
| package javax.swing.text; |
| |
| import java.awt.Rectangle; |
| import javax.swing.BasicSwingTestCase; |
| |
| public class BoxViewTest extends BasicSwingTestCase { |
| private Document doc; |
| |
| private Element root; |
| |
| private BoxView view; |
| |
| /* |
| * @see TestCase#setUp() |
| */ |
| @Override |
| protected void setUp() throws Exception { |
| super.setUp(); |
| doc = new PlainDocument(); |
| doc.insertString(0, "line1\nline\t2", null); |
| root = doc.getDefaultRootElement(); |
| view = new BoxView(root, View.X_AXIS); |
| } |
| |
| public void testGetAlignment() { |
| assertEquals(0.5f, view.getAlignment(View.X_AXIS), 0.00001f); |
| assertEquals(0.5f, view.getAlignment(View.Y_AXIS), 0.00001f); |
| try { |
| view.getAlignment(3); |
| fail("IllegalArgumentException must be thrown"); |
| } catch (IllegalArgumentException e) { |
| } |
| } |
| |
| public void testPreferenceChanged() { |
| view.layout(width, height); |
| assertTrue(view.isLayoutValid(View.X_AXIS)); |
| assertTrue(view.isLayoutValid(View.Y_AXIS)); |
| view.preferenceChanged(null, true, false); |
| assertFalse(view.isLayoutValid(View.X_AXIS)); |
| assertTrue(view.isLayoutValid(View.Y_AXIS)); |
| view.layout(width, height); |
| view.preferenceChanged(null, false, true); |
| assertTrue(view.isLayoutValid(View.X_AXIS)); |
| assertFalse(view.isLayoutValid(View.Y_AXIS)); |
| } |
| |
| public void testReplace() { |
| // Check child cound and size of the cache of allocations |
| assertEquals(0, view.getViewCount()); |
| try { |
| view.getOffset(view.getAxis(), 0); |
| fail("ArrayIndexOutOfBoundsException is expected"); |
| } catch (ArrayIndexOutOfBoundsException e) { |
| } |
| try { |
| view.getSpan(view.getAxis(), 0); |
| fail("ArrayIndexOutOfBoundsException is expected"); |
| } catch (ArrayIndexOutOfBoundsException e) { |
| } |
| // Do layout and check it became valid |
| view.layout(width, height); |
| assertTrue(view.isLayoutValid(View.X_AXIS)); |
| assertTrue(view.isLayoutValid(View.Y_AXIS)); |
| // Add two children into the view |
| view.replace(0, 0, new View[] { new PlainView(root), new PlainView(root) }); |
| // Check the side effects |
| assertFalse(view.isLayoutValid(View.X_AXIS)); |
| assertFalse(view.isLayoutValid(View.Y_AXIS)); |
| // Now we can get offset and span of child at index 1 |
| view.getOffset(view.getAxis(), 1); |
| view.getSpan(view.getAxis(), 1); |
| // ...but can't get ones of child at index 2 as it doesn't exist |
| try { |
| view.getOffset(view.getAxis(), 2); |
| fail("ArrayIndexOutOfBoundsException is expected"); |
| } catch (ArrayIndexOutOfBoundsException e) { |
| } |
| try { |
| view.getSpan(view.getAxis(), 2); |
| fail("ArrayIndexOutOfBoundsException is expected"); |
| } catch (ArrayIndexOutOfBoundsException e) { |
| } |
| } |
| |
| private static void assertCalled(final boolean[] called, final boolean layout, |
| final boolean major, final boolean minor) { |
| assertEquals(layout, called[0]); |
| assertEquals(major, called[1]); |
| assertEquals(minor, called[2]); |
| // Reset flags |
| called[0] = called[1] = called[2] = false; |
| } |
| |
| public void testSetSize() { |
| final boolean[] called = new boolean[] { false, false, false }; |
| view = new BoxView(root, View.X_AXIS) { |
| @Override |
| public void layout(final int w, final int h) { |
| assertEquals(width - getLeftInset() - getRightInset(), w); |
| assertEquals(height - getTopInset() - getBottomInset(), h); |
| called[0] = true; |
| super.layout(w, h); |
| } |
| |
| @Override |
| protected void layoutMajorAxis(final int targetSpan, final int axis, |
| final int[] offsets, final int[] spans) { |
| called[1] = true; |
| super.layoutMajorAxis(targetSpan, axis, offsets, spans); |
| } |
| |
| @Override |
| protected void layoutMinorAxis(final int targetSpan, final int axis, |
| final int[] offsets, final int[] spans) { |
| called[2] = true; |
| super.layoutMinorAxis(targetSpan, axis, offsets, spans); |
| } |
| }; |
| view.setSize(width, height); |
| assertCalled(called, true, true, true); |
| // Call with same sizes doesn't do the layout itself |
| view.setSize(width, height); |
| assertCalled(called, true, false, false); |
| // Set only left inset, layout of the major axis (X) must be updated |
| view.setInsets((short) 0, (short) 1, (short) 0, (short) 0); |
| view.setSize(width, height); |
| assertCalled(called, true, true, false); |
| // Set new insets and try again |
| view.setParagraphInsets(CompositeViewTest.getAttributeSet()); |
| view.setSize(width, height); |
| assertCalled(called, true, true, true); |
| } |
| |
| /** |
| * Rectangle that is used in tests of is{After,Before}. |
| */ |
| private static final Rectangle rect = new Rectangle(10, 15, 20, 30); |
| |
| /** |
| * Tests isAfter with default axis value of X. |
| * |
| * Differences in values are marked with asterisk in trailing comment. |
| */ |
| public void testIsAfter01() { |
| assertEquals(View.X_AXIS, view.getAxis()); |
| assertFalse(view.isAfter(0, 0, rect)); |
| assertFalse(view.isAfter(9, 0, rect)); |
| assertFalse(view.isAfter(0, 14, rect)); |
| assertFalse(view.isAfter(9, 14, rect)); |
| assertFalse(view.isAfter(9, 15, rect)); |
| assertFalse(view.isAfter(9, 35, rect)); |
| assertFalse(view.isAfter(10, 14, rect)); |
| assertFalse(view.isAfter(10, 15, rect)); |
| assertFalse(view.isAfter(20, 15, rect)); |
| assertFalse(view.isAfter(20, 14, rect)); |
| assertFalse(view.isAfter(20, 45, rect)); |
| assertFalse(view.isAfter(20, 46, rect)); // * |
| assertFalse(view.isAfter(20, 50, rect)); // * |
| assertFalse(view.isAfter(30, 20, rect)); |
| assertTrue(view.isAfter(31, 20, rect)); // * |
| assertTrue(view.isAfter(31, 15, rect)); // * |
| assertTrue(view.isAfter(31, 0, rect)); // * |
| } |
| |
| /** |
| * Tests isAfter with axis value set to Y. |
| * |
| * Differences in values are marked with asterisk in trailing comment. |
| */ |
| public void testIsAfter02() { |
| view.setAxis(View.Y_AXIS); |
| assertFalse(view.isAfter(0, 0, rect)); |
| assertFalse(view.isAfter(9, 0, rect)); |
| assertFalse(view.isAfter(0, 14, rect)); |
| assertFalse(view.isAfter(9, 14, rect)); |
| assertFalse(view.isAfter(9, 15, rect)); |
| assertFalse(view.isAfter(9, 35, rect)); |
| assertFalse(view.isAfter(10, 14, rect)); |
| assertFalse(view.isAfter(10, 15, rect)); |
| assertFalse(view.isAfter(20, 15, rect)); |
| assertFalse(view.isAfter(20, 14, rect)); |
| assertFalse(view.isAfter(20, 45, rect)); |
| assertTrue(view.isAfter(20, 46, rect)); // * |
| assertTrue(view.isAfter(20, 50, rect)); // * |
| assertFalse(view.isAfter(30, 20, rect)); |
| assertFalse(view.isAfter(31, 20, rect)); // * |
| assertFalse(view.isAfter(31, 15, rect)); // * |
| assertFalse(view.isAfter(31, 0, rect)); // * |
| } |
| |
| /** |
| * Tests isBefore with default axis value of X. |
| * |
| * Differences in values are marked with asterisk in trailing comment. |
| */ |
| public void testIsBefore01() { |
| assertTrue(view.isBefore(0, 0, rect)); |
| assertTrue(view.isBefore(9, 0, rect)); |
| assertTrue(view.isBefore(0, 14, rect)); |
| assertTrue(view.isBefore(9, 14, rect)); |
| assertTrue(view.isBefore(9, 15, rect)); // * |
| assertTrue(view.isBefore(9, 35, rect)); // * |
| assertFalse(view.isBefore(10, 14, rect)); // * |
| assertFalse(view.isBefore(10, 15, rect)); |
| assertFalse(view.isBefore(20, 15, rect)); |
| assertFalse(view.isBefore(20, 14, rect)); // * |
| } |
| |
| /** |
| * Tests isBefore with axis value set to Y. |
| * |
| * Differences in values are marked with asterisk in trailing comment. |
| */ |
| public void testIsBefore02() { |
| view.setAxis(View.Y_AXIS); |
| assertTrue(view.isBefore(0, 0, rect)); |
| assertTrue(view.isBefore(9, 0, rect)); |
| assertTrue(view.isBefore(0, 14, rect)); |
| assertTrue(view.isBefore(9, 14, rect)); |
| assertFalse(view.isBefore(9, 15, rect)); // * |
| assertFalse(view.isBefore(9, 35, rect)); // * |
| assertTrue(view.isBefore(10, 14, rect)); // * |
| assertFalse(view.isBefore(10, 15, rect)); |
| assertFalse(view.isBefore(20, 15, rect)); |
| assertTrue(view.isBefore(20, 14, rect)); // * |
| } |
| |
| public void testBoxView() { |
| view = new BoxView(root, View.X_AXIS); |
| assertSame(root, view.getElement()); |
| assertEquals(View.X_AXIS, view.getAxis()); |
| view = new BoxView(root, View.Y_AXIS); |
| assertSame(root, view.getElement()); |
| assertEquals(View.Y_AXIS, view.getAxis()); |
| final boolean[] setAxisCalled = new boolean[1]; |
| view = new BoxView(root, -1251) { |
| @Override |
| public void setAxis(int axis) { |
| setAxisCalled[0] = true; |
| super.setAxis(axis); |
| } |
| }; |
| assertSame(root, view.getElement()); |
| assertEquals(-1251, view.getAxis()); |
| assertFalse(setAxisCalled[0]); |
| } |
| |
| public void testGetAxis() { |
| assertEquals(View.X_AXIS, view.getAxis()); |
| } |
| |
| public void testGetHeight() { |
| assertEquals(0, view.getHeight()); |
| assertFalse(view.isLayoutValid(View.X_AXIS)); |
| view.layout(width, height); |
| assertEquals(height, view.getHeight()); |
| view.setSize(width, height); |
| assertEquals(height, view.getHeight()); |
| // Layout invalidation doesn't change the height |
| view.layoutChanged(View.Y_AXIS); |
| assertEquals(height, view.getHeight()); |
| // Put some insets |
| view.setInsets((short) 10, (short) 0, (short) 0, (short) 0); |
| view.setSize(width, height); |
| if (isHarmony()) { |
| assertEquals(height - view.getTopInset(), view.getHeight()); |
| } else { |
| // The width isn't changed |
| assertEquals(height, view.getHeight()); |
| } |
| view.setInsets((short) 0, (short) 0, (short) 10, (short) 0); |
| view.setSize(width, height); |
| if (isHarmony()) { |
| assertEquals(height - view.getBottomInset(), view.getHeight()); |
| } else { |
| // The width is reduced by right inset twice |
| assertEquals(height - 2 * view.getBottomInset(), view.getHeight()); |
| } |
| // No matter if insets are set, layout width isn't changed |
| view.setInsets((short) 7, (short) 0, (short) 4, (short) 0); |
| view.layout(width, height); |
| if (isHarmony()) { |
| assertEquals(height, view.getHeight()); |
| } else { |
| assertEquals(height + (view.getTopInset() - view.getBottomInset()), view |
| .getHeight()); |
| } |
| } |
| |
| public void testGetWidth() { |
| assertEquals(0, view.getWidth()); |
| assertFalse(view.isLayoutValid(View.X_AXIS)); |
| view.layout(width, height); |
| assertEquals(width, view.getWidth()); |
| view.setSize(width, height); |
| assertEquals(width, view.getWidth()); |
| // Layout invalidation doesn't change the width |
| view.layoutChanged(View.X_AXIS); |
| assertEquals(width, view.getWidth()); |
| // Put some insets |
| view.setInsets((short) 0, (short) 10, (short) 0, (short) 0); |
| view.setSize(width, height); |
| if (isHarmony()) { |
| assertEquals(width - view.getLeftInset(), view.getWidth()); |
| } else { |
| // The width isn't changed |
| assertEquals(width, view.getWidth()); |
| } |
| view.setInsets((short) 0, (short) 0, (short) 0, (short) 10); |
| view.setSize(width, height); |
| if (isHarmony()) { |
| assertEquals(width - view.getRightInset(), view.getWidth()); |
| } else { |
| // The width is reduced by right inset twice |
| assertEquals(width - 2 * view.getRightInset(), view.getWidth()); |
| } |
| // No matter if insets are set, layout width isn't changed |
| view.setInsets((short) 0, (short) 7, (short) 0, (short) 4); |
| view.layout(width, height); |
| if (isHarmony()) { |
| assertEquals(width, view.getWidth()); |
| } else { |
| assertEquals(width + (view.getLeftInset() - view.getRightInset()), view.getWidth()); |
| } |
| } |
| |
| public void testIsAllocationValid() { |
| assertFalse(view.isAllocationValid()); |
| view.layout(width, height); |
| assertTrue(view.isAllocationValid()); |
| view.preferenceChanged(null, true, false); |
| assertFalse(view.isAllocationValid()); |
| } |
| |
| public void testIsLayoutValid() { |
| assertFalse(view.isLayoutValid(View.X_AXIS)); |
| assertFalse(view.isLayoutValid(View.Y_AXIS)); |
| view.layout(width, height); |
| assertTrue(view.isLayoutValid(View.X_AXIS)); |
| assertTrue(view.isLayoutValid(View.Y_AXIS)); |
| } |
| |
| private final int width = 150; |
| |
| private final int height = 325; |
| |
| public void testLayout() { |
| final boolean[] called = new boolean[] { false, false }; |
| view = new BoxView(root, View.X_AXIS) { |
| @Override |
| protected void layoutMajorAxis(final int targetSpan, final int axis, |
| final int[] offsets, final int[] spans) { |
| called[0] = true; |
| assertEquals(width, targetSpan); |
| assertEquals(X_AXIS, axis); |
| super.layoutMajorAxis(targetSpan, axis, offsets, spans); |
| } |
| |
| @Override |
| protected void layoutMinorAxis(final int targetSpan, final int axis, |
| final int[] offsets, final int[] spans) { |
| called[1] = true; |
| assertEquals(height, targetSpan); |
| assertEquals(Y_AXIS, axis); |
| super.layoutMinorAxis(targetSpan, axis, offsets, spans); |
| } |
| }; |
| assertFalse(view.isLayoutValid(View.X_AXIS)); |
| assertFalse(view.isLayoutValid(View.Y_AXIS)); |
| view.layout(width, height); |
| assertTrue(view.isLayoutValid(View.X_AXIS)); |
| assertTrue(view.isLayoutValid(View.Y_AXIS)); |
| assertTrue(called[0]); |
| called[0] = false; |
| assertTrue(called[1]); |
| called[1] = false; |
| view.preferenceChanged(null, true, false); |
| assertFalse(view.isLayoutValid(View.X_AXIS)); |
| assertTrue(view.isLayoutValid(View.Y_AXIS)); |
| view.layout(width, height); |
| assertTrue(called[0]); |
| called[0] = false; |
| assertFalse(called[1]); |
| called[1] = false; |
| } |
| |
| /** |
| * Tests that <code>layoutChanged</code> isn't called |
| * when width or height passed to |
| * <code>layout</code> is changed. |
| */ |
| public void testLayout02() { |
| final boolean[] called = new boolean[] { false }; |
| view = new BoxView(root, View.X_AXIS) { |
| @Override |
| public void layoutChanged(int axis) { |
| called[0] = false; |
| super.layoutChanged(axis); |
| } |
| }; |
| assertFalse(view.isLayoutValid(View.X_AXIS)); |
| assertFalse(view.isLayoutValid(View.Y_AXIS)); |
| view.layout(width, height); |
| assertTrue(view.isLayoutValid(View.X_AXIS)); |
| assertTrue(view.isLayoutValid(View.Y_AXIS)); |
| assertFalse(called[0]); |
| view.layout(width, height); |
| assertFalse(called[0]); |
| view.layout(width - 10, height); |
| assertFalse(called[0]); |
| view.layout(width - 10, height - 20); |
| assertFalse(called[0]); |
| } |
| |
| public void testLayoutChanged() { |
| view.layout(width, height); |
| assertTrue(view.isLayoutValid(View.X_AXIS)); |
| assertTrue(view.isLayoutValid(View.Y_AXIS)); |
| view.layoutChanged(View.Y_AXIS); |
| assertTrue(view.isLayoutValid(View.X_AXIS)); |
| assertFalse(view.isLayoutValid(View.Y_AXIS)); |
| } |
| |
| public void testSetAxis() { |
| view.setAxis(View.Y_AXIS); |
| assertEquals(View.Y_AXIS, view.getAxis()); |
| view.setAxis(View.X_AXIS); |
| assertEquals(View.X_AXIS, view.getAxis()); |
| view.setAxis(-1251); |
| assertEquals(-1251, view.getAxis()); |
| } |
| /* |
| public void testPaint() { |
| } |
| |
| public void testPaintChild() { |
| } |
| */ |
| } |