2525
2626package test .javafx .scene .layout ;
2727
28+ import javafx .geometry .Pos ;
2829import javafx .scene .Parent ;
2930import javafx .scene .ParentShim ;
3031import javafx .scene .layout .HBox ;
3132import javafx .scene .layout .Pane ;
33+ import javafx .scene .layout .VBox ;
3234import javafx .scene .shape .Rectangle ;
3335import javafx .scene .text .Text ;
3436
@@ -77,10 +79,10 @@ public class BaselineTest {
7779 @ Test public void testParentSelectsFirstTextNodeAsBaselineSource () {
7880 Pane p = new Pane ();
7981 p .getChildren ().add (new Rectangle ());
80- p .getChildren ().add (new MockTextResizable (100 , 100 , 1234 ));
82+ p .getChildren ().add (new TextRectangle (100 , 100 , 1234 ));
8183 p .getChildren ().add (new Rectangle ());
8284
83- assertEquals (1234 , p .getBaselineOffset (), 1e-100 );
85+ assertEquals (1234 , p .getBaselineOffset (), 1e-10 );
8486 }
8587
8688 /**
@@ -93,10 +95,10 @@ public class BaselineTest {
9395 { setPrefBaseline (true ); }
9496 @ Override public double getBaselineOffset () { return 1234 ; }
9597 });
96- p .getChildren ().add (new MockTextResizable (100 , 100 , 200 ));
98+ p .getChildren ().add (new TextRectangle (100 , 100 , 200 ));
9799 p .getChildren ().add (new Rectangle ());
98100
99- assertEquals (1234 , p .getBaselineOffset (), 1e-100 );
101+ assertEquals (1234 , p .getBaselineOffset (), 1e-10 );
100102 }
101103
102104 /**
@@ -106,11 +108,11 @@ public class BaselineTest {
106108 @ Test public void testIsTextBaselinePropagatesToParent () {
107109 Pane p = new Pane ();
108110 p .getChildren ().add (new HBox () {
109- { getChildren ().add (new MockTextResizable (100 , 100 , 1234 )); }
111+ { getChildren ().add (new TextRectangle (100 , 100 , 1234 )); }
110112 });
111113
112114 assertTrue (p .isTextBaseline ());
113- assertEquals (1234 , p .getBaselineOffset (), 1e-100 );
115+ assertEquals (1234 , p .getBaselineOffset (), 1e-10 );
114116 }
115117
116118 /**
@@ -121,13 +123,13 @@ public class BaselineTest {
121123 Pane p = new Pane ();
122124 p .getChildren ().add (new HBox () {
123125 {
124- getChildren ().add (new MockTextResizable (100 , 100 , 1234 ));
125- getChildren ().add (new MockResizable (100 , 100 ) {{ setPrefBaseline (true ); }});
126+ getChildren ().add (new TextRectangle (100 , 100 , 1234 ));
127+ getChildren ().add (new Rectangle (100 , 100 ) {{ setPrefBaseline (true ); }});
126128 }
127129 });
128130
129131 assertFalse (p .isTextBaseline ());
130- assertEquals (90 , p .getBaselineOffset (), 1e-100 );
132+ assertEquals (100 , p .getBaselineOffset (), 1e-10 );
131133 }
132134
133135 /**
@@ -137,21 +139,91 @@ public class BaselineTest {
137139 */
138140 @ Test public void testPrefBaselineChangedUpdatesParentIsTextBaseline () {
139141 Pane p = new Pane ();
140- MockResizable [] r = new MockResizable [1 ];
142+ Rectangle [] r = new Rectangle [1 ];
141143 p .getChildren ().add (new HBox () {
142144 {
143- getChildren ().add (new MockTextResizable (100 , 100 , 1234 ));
144- getChildren ().add (r [0 ] = new MockResizable (100 , 100 ));
145+ getChildren ().add (new TextRectangle (100 , 100 , 1234 ));
146+ getChildren ().add (r [0 ] = new Rectangle (100 , 100 ));
145147 }
146148 });
147149
150+ assertTrue (p .isTextBaseline ());
151+ assertEquals (1234 , p .getBaselineOffset (), 1e-10 );
152+
148153 r [0 ].setPrefBaseline (true );
149154 assertFalse (p .isTextBaseline ());
150- assertEquals (90 , p .getBaselineOffset (), 1e-100 );
155+ assertEquals (100 , p .getBaselineOffset (), 1e-10 );
151156
152157 r [0 ].setPrefBaseline (false );
153158 assertTrue (p .isTextBaseline ());
154- assertEquals (1234 , p .getBaselineOffset (), 1e-100 );
159+ assertEquals (1234 , p .getBaselineOffset (), 1e-10 );
160+ }
161+
162+ /**
163+ * Tests that the baseline offset is calculated correctly from two text-node children
164+ * in different branches of the scene graph.
165+ *
166+ * w=20 w=20
167+ * ┌───────┐ ┌───────┐
168+ * h=20 │ A │ │ C │ h=40
169+ * ├───────┴───────┤ │
170+ * ═════╪═══════════════╪═══════╪═════ baseline=30
171+ * B└───────────────┼───────┤
172+ * w=40 │ D │ h=20
173+ * └───────┘
174+ */
175+ @ Test public void testTextBaselineFromChildrenInDifferentBranches () {
176+ HBox p = new HBox ();
177+ p .setAlignment (Pos .BASELINE_LEFT );
178+ p .getChildren ().add (new VBox () {{
179+ getChildren ().add (new Rectangle (20 , 20 )); // box A
180+ getChildren ().add (new TextRectangle (40 , 20 , 10 )); // box B
181+ }});
182+ p .getChildren ().add (new VBox () {{
183+ getChildren ().add (new TextRectangle (20 , 40 , 30 )); // box C
184+ getChildren ().add (new Rectangle (20 , 20 )); // box D
185+ }});
186+ p .layout ();
187+ p .autosize ();
188+
189+ assertTrue (p .isTextBaseline ());
190+ assertEquals (30 , p .getBaselineOffset (), 1e-10 );
191+ assertEquals (60 , p .getHeight (), 1e-10 );
192+ assertEquals (60 , p .getWidth (), 1e-10 );
193+ }
194+
195+ /**
196+ * Similar test setup to {@link #testTextBaselineFromChildrenInDifferentBranches()}, with the
197+ * difference that there is only a single text-node child in the scene graph.
198+ *
199+ * w=20
200+ * w=20 ┌───────┐
201+ * ┌───────┐ │ │
202+ * h=20 │ A │ │ C │ h=40
203+ * ├───────┴───────┤ │
204+ * ═════╪═══════════════╪─═─═─═─╪═════ baseline=40
205+ * B└───────────────┤ │ h=20
206+ * w=40 └───────┘
207+ *
208+ */
209+ @ Test public void testTextBaselineFromChildInSingleBranch () {
210+ HBox p = new HBox ();
211+ p .setAlignment (Pos .BASELINE_LEFT );
212+ p .getChildren ().add (new VBox () {{
213+ getChildren ().add (new Rectangle (20 , 20 )); // box A
214+ getChildren ().add (new TextRectangle (40 , 20 , 10 )); // box B
215+ }});
216+ p .getChildren ().add (new VBox () {{
217+ getChildren ().add (new Rectangle (20 , 40 )); // box C
218+ getChildren ().add (new Rectangle (20 , 20 )); // box D
219+ }});
220+ p .layout ();
221+ p .autosize ();
222+
223+ assertTrue (p .isTextBaseline ());
224+ assertEquals (40 , p .getBaselineOffset (), 1e-10 );
225+ assertEquals (60 , p .getHeight (), 1e-10 );
226+ assertEquals (60 , p .getWidth (), 1e-10 );
155227 }
156228
157229}
0 commit comments