1 /*
   2  * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package javafx.scene.layout;
  27 
  28 import java.lang.reflect.Field;
  29 import javafx.geometry.Insets;
  30 import javafx.scene.image.Image;
  31 import javafx.scene.paint.Color;
  32 import javafx.scene.shape.StrokeType;
  33 import org.junit.Test;
  34 
  35 import static javafx.scene.layout.BorderRepeat.*;
  36 import static org.junit.Assert.*;
  37 
  38 /**
  39  * Tests for Border.
  40  */
  41 public class BorderTest {
  42     private static final BorderStroke[] STROKES_1 = new BorderStroke[] {
  43             new BorderStroke(Color.RED, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, BorderWidths.EMPTY)
  44     };
  45     private static final BorderStroke[] STROKES_2 = new BorderStroke[] {
  46             new BorderStroke(Color.GREEN, BorderStrokeStyle.DASHED, new CornerRadii(3), new BorderWidths(4)),
  47             new BorderStroke(Color.BLUE, BorderStrokeStyle.DOTTED, new CornerRadii(6), new BorderWidths(8))
  48     };
  49 
  50     private static final Image IMAGE_1 = new Image("javafx/scene/layout/red.png");
  51     private static final Image IMAGE_2 = new Image("javafx/scene/layout/blue.png");
  52     private static final Image IMAGE_3 = new Image("javafx/scene/layout/green.png");
  53     private static final Image IMAGE_4 = new Image("javafx/scene/layout/yellow.png");
  54 
  55     private static final BorderImage[] IMAGES_1 = new BorderImage[] {
  56             new BorderImage(IMAGE_1, BorderWidths.DEFAULT, Insets.EMPTY, BorderWidths.EMPTY, false, SPACE, SPACE)
  57     };
  58 
  59     private static final BorderImage[] IMAGES_2 = new BorderImage[] {
  60             new BorderImage(IMAGE_2, new BorderWidths(3), new Insets(4), BorderWidths.EMPTY, false, REPEAT, REPEAT),
  61             new BorderImage(IMAGE_3, new BorderWidths(6), new Insets(2), BorderWidths.EMPTY, false, SPACE, ROUND),
  62             new BorderImage(IMAGE_4, new BorderWidths(3), Insets.EMPTY, new BorderWidths(3, 4, 5, 6), true, STRETCH, SPACE)
  63     };
  64 
  65     @Test public void instanceCreation() {
  66         Border b = new Border(STROKES_1, IMAGES_1);
  67         assertEquals(STROKES_1.length, b.getStrokes().size(), 0);
  68         assertEquals(STROKES_1[0], b.getStrokes().get(0));
  69         assertEquals(IMAGES_1.length, b.getImages().size(), 0);
  70         assertEquals(IMAGES_1[0], b.getImages().get(0));
  71     }
  72 
  73     @Test public void instanceCreation2() {
  74         Border b = new Border(STROKES_2, IMAGES_2);
  75         assertEquals(STROKES_2.length, b.getStrokes().size(), 0);
  76         assertEquals(STROKES_2[0], b.getStrokes().get(0));
  77         assertEquals(STROKES_2[1], b.getStrokes().get(1));
  78         assertEquals(IMAGES_2.length, b.getImages().size(), 0);
  79         assertEquals(IMAGES_2[0], b.getImages().get(0));
  80         assertEquals(IMAGES_2[1], b.getImages().get(1));
  81         assertEquals(IMAGES_2[2], b.getImages().get(2));
  82     }
  83 
  84     @Test public void instanceCreationNullstrokes() {
  85         Border b = new Border(null, IMAGES_1);
  86         assertEquals(0, b.getStrokes().size(), 0);
  87         assertEquals(IMAGES_1.length, b.getImages().size(), 0);
  88         assertEquals(IMAGES_1[0], b.getImages().get(0));
  89     }
  90 
  91     @Test public void instanceCreationEmptystrokes() {
  92         Border b = new Border(new BorderStroke[0], IMAGES_1);
  93         assertEquals(0, b.getStrokes().size(), 0);
  94         assertEquals(IMAGES_1.length, b.getImages().size(), 0);
  95         assertEquals(IMAGES_1[0], b.getImages().get(0));
  96     }
  97 
  98     @Test public void instanceCreationNullImages() {
  99         Border b = new Border(STROKES_1, null);
 100         assertEquals(STROKES_1.length, b.getStrokes().size(), 0);
 101         assertEquals(STROKES_1[0], b.getStrokes().get(0));
 102         assertEquals(0, b.getImages().size(), 0);
 103     }
 104 
 105     @Test public void instanceCreationEmptyImages() {
 106         Border b = new Border(STROKES_1, new BorderImage[0]);
 107         assertEquals(STROKES_1.length, b.getStrokes().size(), 0);
 108         assertEquals(STROKES_1[0], b.getStrokes().get(0));
 109         assertEquals(0, b.getImages().size(), 0);
 110     }
 111 
 112     @Test public void instanceCreationWithNullsInTheFillArray() {
 113         final BorderStroke[] strokes = new BorderStroke[] {
 114                 null,
 115                 new BorderStroke(Color.GREEN, BorderStrokeStyle.SOLID, new CornerRadii(3), new BorderWidths(4)),
 116                 new BorderStroke(Color.BLUE, BorderStrokeStyle.SOLID,new CornerRadii(6), new BorderWidths(8)),
 117         };
 118         Border b = new Border(strokes, null);
 119         assertEquals(2, b.getStrokes().size(), 0);
 120         assertEquals(strokes[1], b.getStrokes().get(0));
 121         assertEquals(strokes[2], b.getStrokes().get(1));
 122     }
 123 
 124     @Test public void instanceCreationWithNullsInTheFillArray2() {
 125         final BorderStroke[] strokes = new BorderStroke[] {
 126                 new BorderStroke(Color.GREEN, BorderStrokeStyle.SOLID, new CornerRadii(3), new BorderWidths(4)),
 127                 null,
 128                 new BorderStroke(Color.BLUE, BorderStrokeStyle.SOLID,new CornerRadii(6), new BorderWidths(8)),
 129         };
 130         Border b = new Border(strokes, null);
 131         assertEquals(2, b.getStrokes().size(), 0);
 132         assertEquals(strokes[0], b.getStrokes().get(0));
 133         assertEquals(strokes[2], b.getStrokes().get(1));
 134     }
 135 
 136     @Test public void instanceCreationWithNullsInTheFillArray3() {
 137         final BorderStroke[] strokes = new BorderStroke[] {
 138                 new BorderStroke(Color.GREEN, BorderStrokeStyle.SOLID, new CornerRadii(3), new BorderWidths(4)),
 139                 new BorderStroke(Color.BLUE, BorderStrokeStyle.SOLID, new CornerRadii(6), new BorderWidths(8)),
 140                 null
 141         };
 142         Border b = new Border(strokes, null);
 143         assertEquals(2, b.getStrokes().size(), 0);
 144         assertEquals(strokes[0], b.getStrokes().get(0));
 145         assertEquals(strokes[1], b.getStrokes().get(1));
 146     }
 147 
 148     @Test public void instanceCreationWithNullsInTheFillArray4() {
 149         final BorderStroke[] strokes = new BorderStroke[] {
 150                 null
 151         };
 152         Border b = new Border(strokes, null);
 153         assertEquals(0, b.getStrokes().size(), 0);
 154     }
 155 
 156     @Test public void instanceCreationWithNullsInTheImageArray() {
 157         final BorderImage[] images = new BorderImage[] {
 158                 null,
 159                 new BorderImage(IMAGE_2, new BorderWidths(3), new Insets(4), BorderWidths.EMPTY, false, REPEAT, REPEAT),
 160                 new BorderImage(IMAGE_3, new BorderWidths(6), new Insets(2), BorderWidths.EMPTY, false, SPACE, ROUND),
 161                 new BorderImage(IMAGE_4, new BorderWidths(3), Insets.EMPTY, new BorderWidths(3, 4, 5, 6), true, STRETCH, SPACE)
 162         };
 163         Border b = new Border(null, images);
 164         assertEquals(IMAGES_2.length, b.getImages().size(), 0);
 165         assertEquals(IMAGES_2[0], b.getImages().get(0));
 166         assertEquals(IMAGES_2[1], b.getImages().get(1));
 167         assertEquals(IMAGES_2[2], b.getImages().get(2));
 168     }
 169 
 170     @Test public void instanceCreationWithNullsInTheImageArray2() {
 171         final BorderImage[] images = new BorderImage[] {
 172                 new BorderImage(IMAGE_2, new BorderWidths(3), new Insets(4), BorderWidths.EMPTY, false, REPEAT, REPEAT),
 173                 null,
 174                 new BorderImage(IMAGE_3, new BorderWidths(6), new Insets(2), BorderWidths.EMPTY, false, SPACE, ROUND),
 175                 new BorderImage(IMAGE_4, new BorderWidths(3), Insets.EMPTY, new BorderWidths(3, 4, 5, 6), true, STRETCH, SPACE)
 176         };
 177         Border b = new Border(null, images);
 178         assertEquals(IMAGES_2.length, b.getImages().size(), 0);
 179         assertEquals(IMAGES_2[0], b.getImages().get(0));
 180         assertEquals(IMAGES_2[1], b.getImages().get(1));
 181         assertEquals(IMAGES_2[2], b.getImages().get(2));
 182     }
 183 
 184     @Test public void instanceCreationWithNullsInTheImageArray3() {
 185         final BorderImage[] images = new BorderImage[] {
 186                 new BorderImage(IMAGE_2, new BorderWidths(3), new Insets(4), BorderWidths.EMPTY, false, REPEAT, REPEAT),
 187                 new BorderImage(IMAGE_3, new BorderWidths(6), new Insets(2), BorderWidths.EMPTY, false, SPACE, ROUND),
 188                 new BorderImage(IMAGE_4, new BorderWidths(3), Insets.EMPTY, new BorderWidths(3, 4, 5, 6), true, STRETCH, SPACE),
 189                 null
 190         };
 191         Border b = new Border(null, images);
 192         assertEquals(IMAGES_2.length, b.getImages().size(), 0);
 193         assertEquals(IMAGES_2[0], b.getImages().get(0));
 194         assertEquals(IMAGES_2[1], b.getImages().get(1));
 195         assertEquals(IMAGES_2[2], b.getImages().get(2));
 196     }
 197 
 198     @Test public void instanceCreationWithNullsInTheImageArray4() {
 199         final BorderImage[] images = new BorderImage[] {
 200                 null
 201         };
 202         Border b = new Border(null, images);
 203         assertEquals(0, b.getImages().size(), 0);
 204     }
 205 
 206     @Test public void suppliedBorderStrokesMutatedLaterDoNotChangeStrokes() {
 207         final BorderStroke stroke = new BorderStroke(Color.GREEN, BorderStrokeStyle.SOLID, new CornerRadii(3), new BorderWidths(4));
 208         final BorderStroke[] strokes = new BorderStroke[] { stroke };
 209         Border b = new Border(strokes, null);
 210         Border b2 = new Border(strokes);
 211         strokes[0] = null;
 212         assertEquals(1, b.getStrokes().size());
 213         assertEquals(1, b2.getStrokes().size());
 214         assertSame(stroke, b.getStrokes().get(0));
 215         assertSame(stroke, b2.getStrokes().get(0));
 216     }
 217 
 218     @Test public void suppliedBorderImagesMutatedLaterDoNotChangeImages() {
 219         final BorderImage image = new BorderImage(IMAGE_2, new BorderWidths(3), new Insets(4),
 220                                                   BorderWidths.EMPTY, false, REPEAT, REPEAT);
 221         final BorderImage[] images = new BorderImage[] { image };
 222         Border b = new Border(null, images);
 223         Border b2 = new Border(images);
 224         images[0] = null;
 225         assertEquals(1, b.getImages().size());
 226         assertEquals(1, b2.getImages().size());
 227         assertSame(image, b.getImages().get(0));
 228         assertSame(image, b2.getImages().get(0));
 229     }
 230 
 231     @Test(expected = UnsupportedOperationException.class)
 232     public void strokesIsUnmodifiable() {
 233         final BorderStroke stroke = new BorderStroke(Color.GREEN, BorderStrokeStyle.SOLID, new CornerRadii(3), new BorderWidths(4));
 234         final BorderStroke[] strokes = new BorderStroke[] { stroke };
 235         Border b = new Border(strokes);
 236         b.getStrokes().add(new BorderStroke(Color.BLUE, BorderStrokeStyle.SOLID, new CornerRadii(6), new BorderWidths(8)));
 237     }
 238 
 239     @Test(expected = UnsupportedOperationException.class)
 240     public void imagesIsUnmodifiable() {
 241         final BorderImage image = new BorderImage(IMAGE_2, new BorderWidths(3), new Insets(4),
 242                                                   BorderWidths.EMPTY, false, REPEAT, REPEAT);
 243         final BorderImage[] images = new BorderImage[] { image };
 244         Border b = new Border(images);
 245         b.getImages().add(
 246                 new BorderImage(
 247                         IMAGE_4, new BorderWidths(3), Insets.EMPTY,
 248                         new BorderWidths(3, 4, 5, 6), true, STRETCH, SPACE));
 249     }
 250 
 251     @Test public void insetsAndOutsets_twoPixelOuterStroke() {
 252         BorderStrokeStyle style = new BorderStrokeStyle(StrokeType.OUTSIDE, null, null, 0, 0, null);
 253         BorderStroke stroke = new BorderStroke(Color.ORANGE, style, new CornerRadii(5), new BorderWidths(2));
 254         Border border = new Border(new BorderStroke[] { stroke }, null);
 255         // This is a 2 pixel solid stroke painted on the OUTSIDE. This means that the
 256         // outsets should be 2 pixel.
 257         assertEquals(new Insets(2), border.getOutsets());
 258         // The insets should be 0, because the stroke is on the OUTSIDE
 259         assertEquals(new Insets(0), border.getInsets());
 260     }
 261 
 262     @Test public void insetsAndOutsets_singlePixelOuterStroke() {
 263         BorderStrokeStyle style = new BorderStrokeStyle(StrokeType.OUTSIDE, null, null, 0, 0, null);
 264         BorderStroke stroke = new BorderStroke(Color.ORANGE, style, new CornerRadii(5), new BorderWidths(1));
 265         Border border = new Border(new BorderStroke[] { stroke }, null);
 266         // This is a 1 pixel solid stroke painted on the OUTSIDE. This means that the
 267         // outsets should be 1 pixel.
 268         assertEquals(new Insets(1), border.getOutsets());
 269         // The insets should be 0, because the stroke is on the OUTSIDE
 270         assertEquals(new Insets(0), border.getInsets());
 271     }
 272 
 273     @Test public void insetsAndOutsets_singlePixelCenteredStroke() {
 274         BorderStrokeStyle style = new BorderStrokeStyle(StrokeType.CENTERED, null, null, 0, 0, null);
 275         BorderStroke stroke = new BorderStroke(Color.ORANGE, style, new CornerRadii(5), new BorderWidths(1));
 276         Border border = new Border(new BorderStroke[] { stroke }, null);
 277         // This is a 1 pixel solid stroke painted CENTERED. This means that the
 278         // outsets should be .5 pixel.
 279         assertEquals(new Insets(.5), border.getOutsets());
 280         // The insets should be .5, because the stroke is CENTERED
 281         assertEquals(new Insets(.5), border.getInsets());
 282     }
 283 
 284     @Test public void insetsAndOutsets_singlePixelInnerStroke() {
 285         BorderStrokeStyle style = new BorderStrokeStyle(StrokeType.INSIDE, null, null, 0, 0, null);
 286         BorderStroke stroke = new BorderStroke(Color.ORANGE, style, new CornerRadii(5), new BorderWidths(1));
 287         Border border = new Border(new BorderStroke[] { stroke }, null);
 288         // This is a 1 pixel solid stroke painted on the INSIDE. This means that the
 289         // outsets should be 0 pixel.
 290         assertEquals(new Insets(0), border.getOutsets());
 291         // The insets should be 1, because the stroke is on the INSIDE
 292         assertEquals(new Insets(1), border.getInsets());
 293     }
 294 
 295     @Test public void insetsAndOutsets_twoPixelOuterStroke_PositiveInsets() {
 296         BorderStrokeStyle style = new BorderStrokeStyle(StrokeType.OUTSIDE, null, null, 0, 0, null);
 297         BorderStroke stroke = new BorderStroke(Color.ORANGE, style, new CornerRadii(5), new BorderWidths(2), new Insets(1, 2, 3, 4));
 298         Border border = new Border(new BorderStroke[] { stroke }, null);
 299         assertEquals(new Insets(1, 0, 0, 0), border.getOutsets());
 300         assertEquals(new Insets(1, 2, 3, 4), border.getInsets());
 301     }
 302 
 303     @Test public void insetsAndOutsets_singlePixelOuterStroke_PositiveInsets() {
 304         BorderStrokeStyle style = new BorderStrokeStyle(StrokeType.OUTSIDE, null, null, 0, 0, null);
 305         BorderStroke stroke = new BorderStroke(Color.ORANGE, style, new CornerRadii(5), new BorderWidths(1), new Insets(1, 2, 3, 4));
 306         Border border = new Border(new BorderStroke[] { stroke }, null);
 307         assertEquals(new Insets(0), border.getOutsets());
 308         assertEquals(new Insets(1, 2, 3, 4), border.getInsets());
 309     }
 310 
 311     @Test public void insetsAndOutsets_singlePixelCenteredStroke_PositiveInsets() {
 312         BorderStrokeStyle style = new BorderStrokeStyle(StrokeType.CENTERED, null, null, 0, 0, null);
 313         BorderStroke stroke = new BorderStroke(Color.ORANGE, style, new CornerRadii(5), new BorderWidths(1), new Insets(1, 2, 3, 4));
 314         Border border = new Border(new BorderStroke[] { stroke }, null);
 315         assertEquals(new Insets(0), border.getOutsets());
 316         assertEquals(new Insets(1.5, 2.5, 3.5, 4.5), border.getInsets());
 317     }
 318 
 319     @Test public void insetsAndOutsets_singlePixelInnerStroke_PositiveInsets() {
 320         BorderStrokeStyle style = new BorderStrokeStyle(StrokeType.INSIDE, null, null, 0, 0, null);
 321         BorderStroke stroke = new BorderStroke(Color.ORANGE, style, new CornerRadii(5), new BorderWidths(1), new Insets(1, 2, 3, 4));
 322         Border border = new Border(new BorderStroke[] { stroke }, null);
 323         assertEquals(new Insets(0), border.getOutsets());
 324         assertEquals(new Insets(2, 3, 4, 5), border.getInsets());
 325     }
 326 
 327     @Test public void insetsAndOutsets_twoPixelOuterStroke_NegativeInsets() {
 328         BorderStrokeStyle style = new BorderStrokeStyle(StrokeType.OUTSIDE, null, null, 0, 0, null);
 329         BorderStroke stroke = new BorderStroke(Color.ORANGE, style, new CornerRadii(5), new BorderWidths(2), new Insets(-1, -2, -3, -4));
 330         Border border = new Border(new BorderStroke[] { stroke }, null);
 331         assertEquals(new Insets(3, 4, 5, 6), border.getOutsets());
 332         assertEquals(new Insets(0), border.getInsets());
 333     }
 334 
 335     @Test public void insetsAndOutsets_singlePixelOuterStroke_NegativeInsets() {
 336         BorderStrokeStyle style = new BorderStrokeStyle(StrokeType.OUTSIDE, null, null, 0, 0, null);
 337         BorderStroke stroke = new BorderStroke(Color.ORANGE, style, new CornerRadii(5), new BorderWidths(1), new Insets(-1, -2, -3, -4));
 338         Border border = new Border(new BorderStroke[] { stroke }, null);
 339         assertEquals(new Insets(2, 3, 4, 5), border.getOutsets());
 340         assertEquals(new Insets(0), border.getInsets());
 341     }
 342 
 343     @Test public void insetsAndOutsets_singlePixelCenteredStroke_NegativeInsets() {
 344         BorderStrokeStyle style = new BorderStrokeStyle(StrokeType.CENTERED, null, null, 0, 0, null);
 345         BorderStroke stroke = new BorderStroke(Color.ORANGE, style, new CornerRadii(5), new BorderWidths(1), new Insets(-1, -2, -3, -4));
 346         Border border = new Border(new BorderStroke[] { stroke }, null);
 347         assertEquals(new Insets(1.5, 2.5, 3.5, 4.5), border.getOutsets());
 348         assertEquals(new Insets(0), border.getInsets());
 349     }
 350 
 351     @Test public void insetsAndOutsets_singlePixelInnerStroke_NegativeInsets() {
 352         BorderStrokeStyle style = new BorderStrokeStyle(StrokeType.INSIDE, null, null, 0, 0, null);
 353         BorderStroke stroke = new BorderStroke(Color.ORANGE, style, new CornerRadii(5), new BorderWidths(1), new Insets(-1, -2, -3, -4));
 354         Border border = new Border(new BorderStroke[] { stroke }, null);
 355         assertEquals(new Insets(1, 2, 3, 4), border.getOutsets());
 356         assertEquals(new Insets(0), border.getInsets());
 357     }
 358 
 359     @Test public void insetsAndOutsets_singlePixelImageWidthNoInsets() {
 360         BorderImage image = new BorderImage(IMAGE_1, new BorderWidths(1), new Insets(0), null, false, null, null);
 361         Border border = new Border(null, new BorderImage[] { image });
 362         assertEquals(new Insets(0), border.getOutsets());
 363         assertEquals(new Insets(1), border.getInsets());
 364     }
 365 
 366     @Test public void insetsAndOutsets_singlePixelImageWidthWithPositiveInsets() {
 367         BorderImage image = new BorderImage(IMAGE_1, new BorderWidths(1), new Insets(10), null, false, null, null);
 368         Border border = new Border(null, new BorderImage[] { image });
 369         assertEquals(new Insets(0), border.getOutsets());
 370         assertEquals(new Insets(11), border.getInsets());
 371     }
 372 
 373     @Test public void insetsAndOutsets_singlePixelImageWidthWithNegativeInsets() {
 374         BorderImage image = new BorderImage(IMAGE_1, new BorderWidths(1), new Insets(-10), null, false, null, null);
 375         Border border = new Border(null, new BorderImage[] { image });
 376         assertEquals(new Insets(10), border.getOutsets());
 377         assertEquals(new Insets(0), border.getInsets());
 378     }
 379 
 380     @Test public void insetsAndOutsets_triplePixelImageWidthWithNegativeInsets() {
 381         BorderImage image = new BorderImage(IMAGE_1, new BorderWidths(3), new Insets(-1), null, false, null, null);
 382         Border border = new Border(null, new BorderImage[] { image });
 383         assertEquals(new Insets(1), border.getOutsets());
 384         assertEquals(new Insets(2), border.getInsets());
 385     }
 386 
 387     @Test public void equivalent() {
 388         Border a = new Border((BorderStroke[])null, null);
 389         Border b = new Border((BorderStroke[])null, null);
 390         assertEquals(a, b);
 391     }
 392 
 393     @Test public void equivalent2() {
 394         Border a = new Border(STROKES_2, null);
 395         Border b = new Border(STROKES_2, null);
 396         assertEquals(a, b);
 397     }
 398 
 399     @Test public void equivalent2b() {
 400         final BorderStroke[] strokes = new BorderStroke[] {
 401             new BorderStroke(Color.GREEN, BorderStrokeStyle.DASHED, new CornerRadii(3), new BorderWidths(4)),
 402             new BorderStroke(Color.BLUE, BorderStrokeStyle.DOTTED, new CornerRadii(6), new BorderWidths(8))
 403         };
 404 
 405         Border a = new Border(STROKES_2, null);
 406         Border b = new Border(strokes, null);
 407 
 408         assertEquals(a, b);
 409     }
 410 
 411     @Test public void equivalent2c() {
 412         final BorderStroke[] strokes = new BorderStroke[] {
 413             new BorderStroke(Color.GREEN, BorderStrokeStyle.DASHED, new CornerRadii(3), new BorderWidths(4)),
 414             new BorderStroke(Color.BLUE, BorderStrokeStyle.DOTTED, new CornerRadii(6), new BorderWidths(8))
 415         };
 416         Border a = new Border(STROKES_2, null);
 417         Border b = new Border(strokes, null);
 418         assertEquals(a, b);
 419     }
 420 
 421     @Test public void equivalent3() {
 422         Border a = new Border(null, IMAGES_2);
 423         Border b = new Border(null, IMAGES_2);
 424         assertEquals(a, b);
 425     }
 426 
 427     @Test public void equivalent3b() {
 428         final BorderImage[] images = new BorderImage[] {
 429                 new BorderImage(IMAGE_2, new BorderWidths(3), new Insets(4), BorderWidths.EMPTY, false, REPEAT, REPEAT),
 430                 new BorderImage(IMAGE_3, new BorderWidths(6), new Insets(2), BorderWidths.EMPTY, false, SPACE, ROUND),
 431                 new BorderImage(IMAGE_4, new BorderWidths(3), Insets.EMPTY, new BorderWidths(3, 4, 5, 6), true, STRETCH, SPACE)
 432         };
 433         Border a = new Border(null, images);
 434         Border b = new Border(null, IMAGES_2);
 435         assertEquals(a, b);
 436     }
 437 
 438     @Test public void equivalent3c() {
 439         final BorderImage[] images = new BorderImage[] {
 440                 new BorderImage(IMAGE_2, new BorderWidths(3), new Insets(4), BorderWidths.EMPTY, false, REPEAT, REPEAT),
 441                 new BorderImage(IMAGE_3, new BorderWidths(6), new Insets(2), BorderWidths.EMPTY, false, SPACE, ROUND),
 442                 new BorderImage(IMAGE_4, new BorderWidths(3), Insets.EMPTY, new BorderWidths(3, 4, 5, 6), true, STRETCH, SPACE)
 443         };
 444         Border a = new Border(null, images);
 445         Border b = new Border(null, IMAGES_2);
 446         assertEquals(a, b);
 447     }
 448 
 449     @Test public void equivalentWithSelf() {
 450         Border a = new Border(null, IMAGES_2);
 451         assertTrue(a.equals(a));
 452     }
 453 
 454     @Test public void equivalentHasSameHashCode() {
 455         Border a = new Border((BorderStroke[])null, null);
 456         Border b = new Border((BorderStroke[])null, null);
 457         assertEquals(a.hashCode(), b.hashCode());
 458     }
 459 
 460     @Test public void equivalentHasSameHashCode2() {
 461         Border a = new Border(STROKES_2, null);
 462         Border b = new Border(STROKES_2, null);
 463         assertEquals(a.hashCode(), b.hashCode());
 464     }
 465 
 466     @Test public void equivalentHasSameHashCode3() {
 467         Border a = new Border(null, IMAGES_2);
 468         Border b = new Border(null, IMAGES_2);
 469         assertEquals(a.hashCode(), b.hashCode());
 470     }
 471 
 472     @Test public void equivalentWithSelfHashCode() {
 473         Border a = new Border(null, IMAGES_2);
 474         assertEquals(a.hashCode(), a.hashCode());
 475     }
 476 
 477     @Test public void notEqual() {
 478         Border a = new Border(STROKES_1, null);
 479         Border b = new Border((BorderStroke[])null, null);
 480         assertFalse(a.equals(b));
 481     }
 482 
 483     @Test public void notEqual2() {
 484         Border a = new Border((BorderStroke[])null, null);
 485         Border b = new Border(STROKES_2, null);
 486         assertFalse(a.equals(b));
 487     }
 488 
 489     @Test public void notEqual3() {
 490         Border a = new Border(null, IMAGES_1);
 491         Border b = new Border((BorderStroke[])null, null);
 492         assertFalse(a.equals(b));
 493     }
 494 
 495     @Test public void notEqual4() {
 496         Border a = new Border((BorderStroke[])null, null);
 497         Border b = new Border(null, IMAGES_2);
 498         assertFalse(a.equals(b));
 499     }
 500 
 501     @Test public void notEqual5() {
 502         Border a = new Border(null, IMAGES_1);
 503         Border b = new Border(null, IMAGES_2);
 504         assertFalse(a.equals(b));
 505     }
 506 
 507     @Test public void notEqual6() {
 508         Border a = new Border(STROKES_1, null);
 509         Border b = new Border(STROKES_2, null);
 510         assertFalse(a.equals(b));
 511     }
 512 
 513     @Test public void notEqualButHaveSameHashCode() {
 514         Border a = new Border(STROKES_1, null);
 515         Border b = new Border(STROKES_2, null);
 516         // Because Border is final, the only way to test this
 517         // appropriately is to use reflection to set the hash
 518         try {
 519             Field f = Border.class.getDeclaredField("hash");
 520             f.setAccessible(true);
 521             f.set(a, 100);
 522             f.set(b, 100);
 523         } catch (Exception e) {
 524             e.printStackTrace();
 525             throw new AssertionError("Failed to reflectively set the hash value");
 526         }
 527 
 528         assertFalse(a.equals(b));
 529     }
 530 
 531     @Test public void notEqualButHaveSameHashCode2() {
 532         Border a = new Border(null, IMAGES_1);
 533         Border b = new Border(null, IMAGES_2);
 534         // Because Border is final, the only way to test this
 535         // appropriately is to use reflection to set the hash
 536         try {
 537             Field f = Border.class.getDeclaredField("hash");
 538             f.setAccessible(true);
 539             f.set(a, 100);
 540             f.set(b, 100);
 541         } catch (Exception e) {
 542             e.printStackTrace();
 543             throw new AssertionError("Failed to reflectively set the hash value");
 544         }
 545 
 546         assertFalse(a.equals(b));
 547     }
 548 
 549     @Test public void notEqualWithNull() {
 550         Border a = new Border((BorderStroke[])null, null);
 551         assertFalse(a.equals(null));
 552     }
 553 
 554     @Test public void notEqualWithRandom() {
 555         Border a = new Border((BorderStroke[])null, null);
 556         assertFalse(a.equals("Some random String"));
 557     }
 558 }