|
25 | 25 |
|
26 | 26 | package test.javafx.scene.control.skin; |
27 | 27 |
|
28 | | -import static org.junit.Assert.assertEquals; |
| 28 | +import java.lang.ref.WeakReference; |
| 29 | + |
| 30 | +import org.junit.After; |
| 31 | +import org.junit.Before; |
| 32 | +import org.junit.Test; |
| 33 | + |
| 34 | +import com.sun.javafx.tk.Toolkit; |
| 35 | + |
| 36 | +import static org.junit.Assert.*; |
29 | 37 |
|
30 | 38 | import javafx.beans.value.ObservableValue; |
| 39 | +import javafx.scene.Scene; |
31 | 40 | import javafx.scene.control.ProgressBar; |
| 41 | +import javafx.scene.control.Skin; |
32 | 42 | import javafx.scene.control.skin.ProgressBarSkin; |
33 | | - |
34 | | -import org.junit.Before; |
35 | | -import org.junit.Test; |
| 43 | +import javafx.scene.layout.Region; |
| 44 | +import javafx.scene.layout.StackPane; |
| 45 | +import javafx.stage.Stage; |
| 46 | +import test.com.sun.javafx.pgstub.StubToolkit; |
36 | 47 |
|
37 | 48 | /** |
38 | 49 | */ |
39 | 50 | public class ProgressBarSkinTest { |
40 | 51 | private ProgressBar progressbar; |
41 | 52 | private ProgressBarSkinMock skin; |
| 53 | + private Scene scene; |
| 54 | + private Stage stage; |
| 55 | + private StackPane root; |
42 | 56 |
|
43 | 57 | @Before public void setup() { |
44 | 58 | progressbar = new ProgressBar(); |
45 | 59 | skin = new ProgressBarSkinMock(progressbar); |
46 | 60 | progressbar.setSkin(skin); |
47 | 61 | } |
48 | 62 |
|
| 63 | + /** |
| 64 | + * Helper method to init the stage only if really needed. |
| 65 | + */ |
| 66 | + private void initStage() { |
| 67 | + //This step is not needed (Just to make sure StubToolkit is loaded into VM) |
| 68 | + Toolkit tk = (StubToolkit)Toolkit.getToolkit(); |
| 69 | + root = new StackPane(); |
| 70 | + scene = new Scene(root); |
| 71 | + stage = new Stage(); |
| 72 | + stage.setScene(scene); |
| 73 | + } |
| 74 | + |
| 75 | + @After |
| 76 | + public void cleanup() { |
| 77 | + if (stage != null) { |
| 78 | + stage.hide(); |
| 79 | + } |
| 80 | + } |
| 81 | + |
| 82 | + /** |
| 83 | + * Test that inner bar width is in sync with its progressbar's width. |
| 84 | + */ |
| 85 | + @Test |
| 86 | + public void testWidthListener() { |
| 87 | + initStage(); |
| 88 | + // set determinate |
| 89 | + double progress = .5; |
| 90 | + progressbar.setProgress(progress); |
| 91 | + // make it resizable |
| 92 | + progressbar.setMaxWidth(2000); |
| 93 | + root.getChildren().setAll(progressbar); |
| 94 | + double stageSize = 300; |
| 95 | + stage.setWidth(stageSize); |
| 96 | + stage.setHeight(stageSize); |
| 97 | + stage.show(); |
| 98 | + // fire to force layout |
| 99 | + Toolkit.getToolkit().firePulse(); |
| 100 | + |
| 101 | + assertEquals("progressbar fills root", root.getWidth(), |
| 102 | + progressbar.getWidth(), 0.5); |
| 103 | + Region innerBar = (Region) progressbar.lookup(".bar"); |
| 104 | + assertEquals("inner bar width updated", |
| 105 | + progressbar.getWidth() * progress, innerBar.getWidth(), 0.5); |
| 106 | + } |
| 107 | + |
| 108 | + WeakReference<Skin<?>> weakSkinRef; |
| 109 | + |
| 110 | + @Test |
| 111 | + public void testWidthListenerGC() { |
| 112 | + ProgressBar progressbar = new ProgressBar(); |
| 113 | + progressbar.setSkin(new ProgressBarSkin(progressbar)); |
| 114 | + weakSkinRef = new WeakReference<>(progressbar.getSkin()); |
| 115 | + progressbar.setSkin(null); |
| 116 | + attemptGC(10); |
| 117 | + assertNull("skin must be gc'ed", weakSkinRef.get()); |
| 118 | + } |
| 119 | + |
| 120 | + private void attemptGC(int n) { |
| 121 | + // Attempt gc n times |
| 122 | + for (int i = 0; i < n; i++) { |
| 123 | + System.gc(); |
| 124 | + System.runFinalization(); |
| 125 | + |
| 126 | + if (weakSkinRef.get() == null) { |
| 127 | + break; |
| 128 | + } |
| 129 | + try { |
| 130 | + Thread.sleep(500); |
| 131 | + } catch (InterruptedException e) { |
| 132 | + System.err.println("InterruptedException occurred during Thread.sleep()"); |
| 133 | + } |
| 134 | + } |
| 135 | + } |
| 136 | + |
49 | 137 | @Test public void maxWidthTracksPreferred() { |
50 | 138 | progressbar.setPrefWidth(500); |
51 | 139 | assertEquals(500, progressbar.maxWidth(-1), 0); |
|
0 commit comments