summaryrefslogtreecommitdiff
path: root/solver/src/test/java/android/support/constraint/solver/AnalyzerTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'solver/src/test/java/android/support/constraint/solver/AnalyzerTest.java')
-rw-r--r--solver/src/test/java/android/support/constraint/solver/AnalyzerTest.java518
1 files changed, 518 insertions, 0 deletions
diff --git a/solver/src/test/java/android/support/constraint/solver/AnalyzerTest.java b/solver/src/test/java/android/support/constraint/solver/AnalyzerTest.java
new file mode 100644
index 0000000..db82c61
--- /dev/null
+++ b/solver/src/test/java/android/support/constraint/solver/AnalyzerTest.java
@@ -0,0 +1,518 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed 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.
+ */
+
+package android.support.constraint.solver;
+
+import android.support.constraint.solver.widgets.Analyzer;
+import android.support.constraint.solver.widgets.ConstraintAnchor.Type;
+import android.support.constraint.solver.widgets.ConstraintWidget;
+import android.support.constraint.solver.widgets.ConstraintWidget.DimensionBehaviour;
+import android.support.constraint.solver.widgets.ConstraintWidgetContainer;
+import android.support.constraint.solver.widgets.Optimizer;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertTrue;
+
+public class AnalyzerTest {
+
+ @Test
+ public void basicAnalyzerTest() {
+ ConstraintWidgetContainer root = new ConstraintWidgetContainer(0, 0, 800, 800);
+ ConstraintWidget A = new ConstraintWidget(20, 20);
+ ConstraintWidget B = new ConstraintWidget(20, 20);
+ ConstraintWidget C = new ConstraintWidget(20, 20);
+
+ root.setDebugSolverName(root.getSystem(), "root");
+ A.setDebugSolverName(root.getSystem(), "A");
+ B.setDebugSolverName(root.getSystem(), "B");
+ C.setDebugSolverName(root.getSystem(), "C");
+
+ A.connect(Type.LEFT, root, Type.LEFT);
+ A.connect(Type.TOP, root, Type.TOP);
+ B.connect(Type.LEFT, root, Type.LEFT);
+ B.connect(Type.BOTTOM, root, Type.BOTTOM);
+ C.connect(Type.RIGHT, root, Type.RIGHT);
+ C.connect(Type.TOP, root, Type.TOP);
+
+ root.add(A, B, C);
+ root.layout();
+ root.setOptimizationLevel(Optimizer.OPTIMIZATION_STANDARD | Optimizer.OPTIMIZATION_GROUPS);
+
+ Analyzer.determineGroups(root);
+
+ assertEquals(root.getWidgetGroups().size(), 3);
+ }
+
+ @Test
+ public void basicAnalyzerTest2() {
+ ConstraintWidgetContainer root = new ConstraintWidgetContainer(0, 0, 800, 800);
+ ConstraintWidget A = new ConstraintWidget(20, 20);
+ ConstraintWidget B = new ConstraintWidget(20, 20);
+ ConstraintWidget C = new ConstraintWidget(20, 20);
+
+ root.setDebugSolverName(root.getSystem(), "root");
+ A.setDebugSolverName(root.getSystem(), "A");
+ B.setDebugSolverName(root.getSystem(), "B");
+ C.setDebugSolverName(root.getSystem(), "C");
+
+ A.connect(Type.LEFT, root, Type.LEFT);
+ A.connect(Type.TOP, root, Type.TOP);
+ A.connect(Type.RIGHT, B, Type.RIGHT);
+ B.connect(Type.TOP, root, Type.TOP);
+ B.connect(Type.RIGHT, C, Type.LEFT);
+ C.connect(Type.RIGHT, root, Type.RIGHT);
+ C.connect(Type.TOP, root, Type.TOP);
+
+ root.add(A, B, C);
+ root.layout();
+ root.setOptimizationLevel(Optimizer.OPTIMIZATION_STANDARD | Optimizer.OPTIMIZATION_GROUPS);
+
+ Analyzer.determineGroups(root);
+
+ assertEquals(root.getWidgetGroups().size(), 1);
+ }
+
+ @Test
+ public void extendedAnalyzerTest() {
+ ConstraintWidgetContainer root = new ConstraintWidgetContainer(0, 0, 800, 800);
+ ConstraintWidget A = new ConstraintWidget(20, 20);
+ ConstraintWidget B = new ConstraintWidget(20, 20);
+ ConstraintWidget C = new ConstraintWidget(20, 20);
+ ConstraintWidget D = new ConstraintWidget(20, 20);
+ ConstraintWidget E = new ConstraintWidget(20, 20);
+ ConstraintWidget F = new ConstraintWidget(20, 20);
+ ConstraintWidget G = new ConstraintWidget(20, 20);
+
+ root.setDebugSolverName(root.getSystem(), "root");
+ A.setDebugSolverName(root.getSystem(), "A");
+ B.setDebugSolverName(root.getSystem(), "B");
+ C.setDebugSolverName(root.getSystem(), "C");
+ D.setDebugSolverName(root.getSystem(), "D");
+ E.setDebugSolverName(root.getSystem(), "E");
+ F.setDebugSolverName(root.getSystem(), "F");
+ G.setDebugSolverName(root.getSystem(), "G");
+
+ A.connect(Type.LEFT, root, Type.LEFT);
+ A.connect(Type.BOTTOM, root, Type.BOTTOM);
+ A.connect(Type.RIGHT, B, Type.LEFT);
+ B.connect(Type.LEFT, A, Type.RIGHT);
+ B.connect(Type.BOTTOM, root, Type.BOTTOM);
+ B.connect(Type.RIGHT, C, Type.LEFT);
+ C.connect(Type.LEFT, B, Type.RIGHT);
+ C.connect(Type.BOTTOM, root, Type.BOTTOM);
+ C.connect(Type.RIGHT, root, Type.RIGHT);
+
+ D.connect(Type.LEFT, root, Type.LEFT);
+ D.connect(Type.BOTTOM, A, Type.TOP);
+
+ E.connect(Type.RIGHT, root, Type.RIGHT);
+ E.connect(Type.BOTTOM, C, Type.TOP);
+ E.connect(Type.TOP, F, Type.BOTTOM);
+
+ F.connect(Type.LEFT, root, Type.LEFT);
+ F.connect(Type.BOTTOM, D, Type.TOP);
+
+ G.connect(Type.RIGHT, root, Type.RIGHT);
+ G.connect(Type.BOTTOM, root, Type.BOTTOM);
+
+ root.add(A, B, C, D, E, F, G);
+ root.layout();
+ root.setOptimizationLevel(Optimizer.OPTIMIZATION_STANDARD | Optimizer.OPTIMIZATION_GROUPS);
+
+ Analyzer.determineGroups(root);
+
+ assertEquals(root.getWidgetGroups().size(), 2);
+ assertEquals(root.getWidgetGroups().get(0).mConstrainedGroup.size(), 6);
+ assertEquals(root.getWidgetGroups().get(1).mConstrainedGroup.size(), 1);
+
+ assertFalse(root.getWidgetGroups().get(0).mConstrainedGroup
+ .contains(root.getWidgetGroups().get(1).mConstrainedGroup.get(0)));
+ }
+
+ @Test
+ public void basicWrapContentGroup() {
+ ConstraintWidgetContainer root = new ConstraintWidgetContainer(0, 0, 800, 800);
+ ConstraintWidget A = new ConstraintWidget(20, 20);
+ ConstraintWidget B = new ConstraintWidget(20, 20);
+ ConstraintWidget C = new ConstraintWidget(20, 20);
+
+ root.setDebugSolverName(root.getSystem(), "root");
+ A.setDebugSolverName(root.getSystem(), "A");
+ B.setDebugSolverName(root.getSystem(), "B");
+ C.setDebugSolverName(root.getSystem(), "C");
+
+ A.connect(Type.LEFT, root, Type.LEFT);
+ A.connect(Type.TOP, root, Type.TOP);
+ B.connect(Type.LEFT, root, Type.LEFT);
+ B.connect(Type.TOP, A, Type.BOTTOM);
+ C.connect(Type.LEFT, root, Type.LEFT);
+ C.connect(Type.TOP, A, Type.TOP);
+
+ root.add(A, B, C);
+ root.setOptimizationLevel(Optimizer.OPTIMIZATION_STANDARD | Optimizer.OPTIMIZATION_GROUPS);
+ root.setHorizontalDimensionBehaviour(DimensionBehaviour.WRAP_CONTENT);
+ root.setVerticalDimensionBehaviour(DimensionBehaviour.WRAP_CONTENT);
+
+ Analyzer.determineGroups(root);
+
+ // Make sure the right number of groups is identified and have the right properties.
+ assertEquals(root.getWidgetGroups().size(), 1);
+ assertEquals(root.getWidgetGroups().get(0).mGroupDimensions[0], 20);
+ assertEquals(root.getWidgetGroups().get(0).mGroupDimensions[1], 40);
+ assertEquals(root.getWidgetGroups().get(0).getStartWidgets(0).size(), 3);
+ assertEquals(root.getWidgetGroups().get(0).getStartWidgets(1).size(), 1);
+ // The layout widget should now have the maximum width and height and be set as fixed.
+ assertEquals(root.getWidth(), 20);
+ assertEquals(root.getHeight(), 40);
+ assertEquals(root.getHorizontalDimensionBehaviour(), DimensionBehaviour.FIXED);
+ assertEquals(root.getVerticalDimensionBehaviour(), DimensionBehaviour.FIXED);
+ }
+
+ @Test
+ public void twoDirectionWrapContentGroup() {
+ ConstraintWidgetContainer root = new ConstraintWidgetContainer(0, 0, 800, 800);
+ ConstraintWidget A = new ConstraintWidget(20, 20);
+ ConstraintWidget B = new ConstraintWidget(10, 10);
+
+ ConstraintWidget C = new ConstraintWidget(20, 20);
+ ConstraintWidget D = new ConstraintWidget(20, 20);
+
+ root.setDebugSolverName(root.getSystem(), "root");
+ A.setDebugSolverName(root.getSystem(), "A");
+ B.setDebugSolverName(root.getSystem(), "B");
+ C.setDebugSolverName(root.getSystem(), "C");
+ D.setDebugSolverName(root.getSystem(), "D");
+
+ A.connect(Type.LEFT, root, Type.LEFT);
+ A.connect(Type.TOP, root, Type.TOP);
+ B.connect(Type.LEFT, root, Type.LEFT);
+ B.connect(Type.TOP, A, Type.BOTTOM);
+
+ C.connect(Type.LEFT, root, Type.LEFT);
+ C.connect(Type.BOTTOM, root, Type.BOTTOM);
+ D.connect(Type.LEFT, root, Type.LEFT);
+ D.connect(Type.BOTTOM, C, Type.BOTTOM);
+
+ root.add(A, B, C, D);
+ root.setOptimizationLevel(Optimizer.OPTIMIZATION_STANDARD | Optimizer.OPTIMIZATION_GROUPS);
+ root.setHorizontalDimensionBehaviour(DimensionBehaviour.WRAP_CONTENT);
+ root.setVerticalDimensionBehaviour(DimensionBehaviour.WRAP_CONTENT);
+
+ Analyzer.determineGroups(root);
+
+ assertEquals(root.getWidgetGroups().size(), 2);
+ assertEquals(root.getWidgetGroups().get(0).mGroupDimensions[0], 20);
+ assertEquals(root.getWidgetGroups().get(0).mGroupDimensions[1], 30);
+ assertEquals(root.getWidgetGroups().get(1).mGroupDimensions[0], 20);
+ assertEquals(root.getWidgetGroups().get(1).mGroupDimensions[1], 20);
+ assertEquals(root.getWidth(), 20);
+ assertEquals(root.getHeight(), 30);
+ }
+
+ @Test
+ public void horizontalVerticalWrapContentGroup() {
+ ConstraintWidgetContainer root = new ConstraintWidgetContainer(0, 0, 800, 800);
+ ConstraintWidget A = new ConstraintWidget(25, 22);
+ ConstraintWidget B = new ConstraintWidget(25, 22);
+
+ ConstraintWidget C = new ConstraintWidget(20, 10);
+ ConstraintWidget D = new ConstraintWidget(20, 20);
+
+ root.setDebugSolverName(root.getSystem(), "root");
+ A.setDebugSolverName(root.getSystem(), "A");
+ B.setDebugSolverName(root.getSystem(), "B");
+ C.setDebugSolverName(root.getSystem(), "C");
+ D.setDebugSolverName(root.getSystem(), "D");
+
+ A.connect(Type.LEFT, root, Type.LEFT);
+ A.connect(Type.TOP, root, Type.TOP);
+ B.connect(Type.LEFT, root, Type.LEFT);
+ B.connect(Type.TOP, A, Type.BOTTOM);
+
+ C.connect(Type.LEFT, root, Type.LEFT);
+ C.connect(Type.BOTTOM, root, Type.BOTTOM);
+ D.connect(Type.LEFT, C, Type.RIGHT);
+ D.connect(Type.BOTTOM, root, Type.BOTTOM);
+
+ root.add(A, B, C, D);
+ root.setOptimizationLevel(Optimizer.OPTIMIZATION_STANDARD | Optimizer.OPTIMIZATION_GROUPS);
+ root.setHorizontalDimensionBehaviour(DimensionBehaviour.WRAP_CONTENT);
+ root.setVerticalDimensionBehaviour(DimensionBehaviour.WRAP_CONTENT);
+
+ Analyzer.determineGroups(root);
+
+ assertEquals(root.getWidgetGroups().size(), 2);
+ assertEquals(root.getWidgetGroups().get(0).mGroupDimensions[0], 25);
+ assertEquals(root.getWidgetGroups().get(0).mGroupDimensions[1], 44);
+ assertEquals(root.getWidgetGroups().get(1).mGroupDimensions[0], 40);
+ assertEquals(root.getWidgetGroups().get(1).mGroupDimensions[1], 20);
+ assertEquals(root.getWidth(), 40);
+ assertEquals(root.getHeight(), 44);
+ }
+
+ @Test
+ public void ignoreWidgetOnReverseFlowWrapContentGroup() {
+ ConstraintWidgetContainer root = new ConstraintWidgetContainer(0, 0, 800, 800);
+ ConstraintWidget A = new ConstraintWidget(20, 20);
+ ConstraintWidget B = new ConstraintWidget(20, 20);
+ ConstraintWidget C = new ConstraintWidget(30, 100);
+
+ root.setDebugSolverName(root.getSystem(), "root");
+ A.setDebugSolverName(root.getSystem(), "A");
+ B.setDebugSolverName(root.getSystem(), "B");
+ C.setDebugSolverName(root.getSystem(), "C");
+
+ A.connect(Type.LEFT, root, Type.LEFT);
+ A.connect(Type.TOP, root, Type.TOP);
+ B.connect(Type.LEFT, root, Type.LEFT);
+ B.connect(Type.TOP, A, Type.BOTTOM);
+ // Widget C is going in a different direction: bottom to top, instead of top to bottom.
+ C.connect(Type.LEFT, root, Type.LEFT);
+ C.connect(Type.BOTTOM, B, Type.BOTTOM);
+
+ root.add(A, B, C);
+ root.setOptimizationLevel(Optimizer.OPTIMIZATION_STANDARD | Optimizer.OPTIMIZATION_GROUPS);
+ root.setHorizontalDimensionBehaviour(DimensionBehaviour.WRAP_CONTENT);
+ root.setVerticalDimensionBehaviour(DimensionBehaviour.WRAP_CONTENT);
+
+ Analyzer.determineGroups(root);
+
+ assertEquals(root.getWidgetGroups().size(), 1);
+ assertEquals(root.getWidth(), 30);
+ assertEquals(root.getHeight(), 40);
+ }
+
+ @Test
+ public void maxSizeOnReverseDirectionWrapTest() {
+ ConstraintWidgetContainer root = new ConstraintWidgetContainer(0, 0, 800, 800);
+ ConstraintWidget A = new ConstraintWidget(20, 20);
+ ConstraintWidget B = new ConstraintWidget(20, 20);
+ ConstraintWidget C = new ConstraintWidget(30, 100);
+ ConstraintWidget D = new ConstraintWidget(20, 200);
+
+ root.setDebugSolverName(root.getSystem(), "root");
+ A.setDebugSolverName(root.getSystem(), "A");
+ B.setDebugSolverName(root.getSystem(), "B");
+ C.setDebugSolverName(root.getSystem(), "C");
+ D.setDebugSolverName(root.getSystem(), "D");
+
+ A.connect(Type.LEFT, root, Type.LEFT);
+ A.connect(Type.TOP, root, Type.TOP);
+ B.connect(Type.LEFT, root, Type.LEFT);
+ B.connect(Type.TOP, A, Type.BOTTOM);
+ // Widget C is going in a different direction: bottom to top, instead of top to bottom.
+ C.connect(Type.LEFT, root, Type.LEFT);
+ C.connect(Type.BOTTOM, B, Type.BOTTOM);
+ D.connect(Type.LEFT, root, Type.LEFT);
+ D.connect(Type.TOP, C, Type.TOP);
+
+ root.add(A, B, C, D);
+ root.setOptimizationLevel(Optimizer.OPTIMIZATION_STANDARD | Optimizer.OPTIMIZATION_GROUPS);
+ root.setHorizontalDimensionBehaviour(DimensionBehaviour.WRAP_CONTENT);
+ root.setVerticalDimensionBehaviour(DimensionBehaviour.WRAP_CONTENT);
+
+ Analyzer.determineGroups(root);
+
+ assertEquals(root.getWidgetGroups().size(), 1);
+ assertEquals(root.getWidth(), 30);
+ assertEquals(root.getHeight(), 140);
+ }
+
+ @Test
+ public void basicBaselineWrapTest() {
+ ConstraintWidgetContainer root = new ConstraintWidgetContainer(0, 0, 400, 400);
+ ConstraintWidget A = new ConstraintWidget(20, 20);
+ ConstraintWidget B = new ConstraintWidget(20, 20);
+ A.setBaselineDistance(10);
+ B.setBaselineDistance(5);
+
+ root.setDebugSolverName(root.getSystem(), "root");
+ A.setDebugSolverName(root.getSystem(), "A");
+ B.setDebugSolverName(root.getSystem(), "B");
+
+ A.connect(Type.LEFT, root, Type.LEFT);
+ A.connect(Type.TOP, root, Type.TOP);
+ B.connect(Type.LEFT, root, Type.LEFT);
+ B.connect(Type.BASELINE, A, Type.BASELINE);
+
+ root.add(A, B);
+ root.setOptimizationLevel(Optimizer.OPTIMIZATION_STANDARD | Optimizer.OPTIMIZATION_GROUPS);
+ root.setHorizontalDimensionBehaviour(DimensionBehaviour.WRAP_CONTENT);
+ root.setVerticalDimensionBehaviour(DimensionBehaviour.WRAP_CONTENT);
+
+ Analyzer.determineGroups(root);
+
+ assertEquals(root.getWidgetGroups().size(), 1);
+ assertEquals(root.getWidth(), 20);
+ assertEquals(root.getHeight(), 25);
+ }
+
+ @Test
+ public void baselineToBaselineWrapTest() {
+ ConstraintWidgetContainer root = new ConstraintWidgetContainer(0, 0, 400, 400);
+ ConstraintWidget A = new ConstraintWidget(20, 20);
+ ConstraintWidget B = new ConstraintWidget(20, 20);
+ ConstraintWidget C = new ConstraintWidget(20, 80);
+ A.setBaselineDistance(5);
+ B.setBaselineDistance(10);
+ C.setBaselineDistance(15);
+
+ root.setDebugSolverName(root.getSystem(), "root");
+ A.setDebugSolverName(root.getSystem(), "A");
+ B.setDebugSolverName(root.getSystem(), "B");
+ C.setDebugSolverName(root.getSystem(), "C");
+
+ A.connect(Type.LEFT, root, Type.LEFT);
+ A.connect(Type.BOTTOM, root, Type.BOTTOM);
+ B.connect(Type.LEFT, A, Type.RIGHT);
+ B.connect(Type.BASELINE, A, Type.BASELINE);
+ C.connect(Type.LEFT, B, Type.RIGHT);
+ C.connect(Type.BASELINE, A, Type.BASELINE);
+
+ root.add(A, B, C);
+ root.setOptimizationLevel(Optimizer.OPTIMIZATION_STANDARD | Optimizer.OPTIMIZATION_GROUPS);
+ root.setHorizontalDimensionBehaviour(DimensionBehaviour.WRAP_CONTENT);
+ root.setVerticalDimensionBehaviour(DimensionBehaviour.WRAP_CONTENT);
+
+ Analyzer.determineGroups(root);
+
+ assertEquals(root.getWidgetGroups().size(), 1);
+ assertEquals(root.getWidth(), 60);
+ assertEquals(root.getHeight(), 30);
+ }
+
+ @Test
+ public void skipSolverBasic() {
+ ConstraintWidgetContainer root = new ConstraintWidgetContainer(0, 0, 800, 800);
+ ConstraintWidget A = new ConstraintWidget(20, 20);
+ ConstraintWidget B = new ConstraintWidget(20, 20);
+ ConstraintWidget C = new ConstraintWidget(20, 20);
+
+ root.setDebugSolverName(root.getSystem(), "root");
+ A.setDebugSolverName(root.getSystem(), "A");
+ B.setDebugSolverName(root.getSystem(), "B");
+ C.setDebugSolverName(root.getSystem(), "C");
+
+ A.connect(Type.LEFT, root, Type.LEFT);
+ A.connect(Type.TOP, root, Type.TOP);
+ B.connect(Type.LEFT, A, Type.LEFT);
+ B.connect(Type.TOP, A, Type.BOTTOM);
+ C.connect(Type.LEFT, B, Type.LEFT);
+ C.connect(Type.TOP, B, Type.BOTTOM);
+
+ root.add(A, B, C);
+ root.setHorizontalDimensionBehaviour(DimensionBehaviour.FIXED);
+ root.setVerticalDimensionBehaviour(DimensionBehaviour.FIXED);
+ root.setOptimizationLevel(Optimizer.OPTIMIZATION_STANDARD | Optimizer.OPTIMIZATION_GROUPS);
+ Analyzer.determineGroups(root);
+
+ assertTrue(root.mSkipSolver);
+ assertEquals(root.mWidgetGroups.size(), 1);
+ assertTrue(root.mWidgetGroups.get(0).mSkipSolver);
+ }
+
+ @Test
+ public void skipSolverWrap() {
+ ConstraintWidgetContainer root = new ConstraintWidgetContainer(0, 0, 800, 800);
+ ConstraintWidget A = new ConstraintWidget(20, 20);
+ ConstraintWidget B = new ConstraintWidget(20, 20);
+ ConstraintWidget C = new ConstraintWidget(20, 20);
+
+ root.setDebugSolverName(root.getSystem(), "root");
+ A.setDebugSolverName(root.getSystem(), "A");
+ B.setDebugSolverName(root.getSystem(), "B");
+ C.setDebugSolverName(root.getSystem(), "C");
+
+ A.connect(Type.LEFT, root, Type.LEFT);
+ A.connect(Type.TOP, root, Type.TOP);
+ B.connect(Type.LEFT, A, Type.LEFT);
+ B.connect(Type.TOP, A, Type.BOTTOM);
+ C.connect(Type.LEFT, B, Type.LEFT);
+ C.connect(Type.TOP, B, Type.BOTTOM);
+
+ root.add(A, B, C);
+ root.setHorizontalDimensionBehaviour(DimensionBehaviour.WRAP_CONTENT);
+ root.setVerticalDimensionBehaviour(DimensionBehaviour.WRAP_CONTENT);
+ root.setOptimizationLevel(Optimizer.OPTIMIZATION_STANDARD | Optimizer.OPTIMIZATION_GROUPS);
+ Analyzer.determineGroups(root);
+
+ assertTrue(root.mSkipSolver);
+ assertEquals(root.mWidgetGroups.size(), 1);
+ assertTrue(root.mWidgetGroups.get(0).mSkipSolver);
+ }
+
+ @Test
+ public void skipSolverMixedDimBehaviour() {
+ ConstraintWidgetContainer root = new ConstraintWidgetContainer(0, 0, 800, 800);
+ ConstraintWidget A = new ConstraintWidget(20, 20);
+ ConstraintWidget B = new ConstraintWidget(20, 20);
+ ConstraintWidget C = new ConstraintWidget(20, 20);
+
+ root.setDebugSolverName(root.getSystem(), "root");
+ A.setDebugSolverName(root.getSystem(), "A");
+ B.setDebugSolverName(root.getSystem(), "B");
+ C.setDebugSolverName(root.getSystem(), "C");
+
+ A.connect(Type.LEFT, root, Type.LEFT);
+ A.connect(Type.TOP, root, Type.TOP);
+ B.connect(Type.LEFT, A, Type.LEFT);
+ B.connect(Type.TOP, A, Type.BOTTOM);
+ C.connect(Type.LEFT, B, Type.LEFT);
+ C.connect(Type.TOP, B, Type.BOTTOM);
+
+ root.add(A, B, C);
+ root.setHorizontalDimensionBehaviour(DimensionBehaviour.WRAP_CONTENT);
+ root.setVerticalDimensionBehaviour(DimensionBehaviour.FIXED);
+ root.setOptimizationLevel(Optimizer.OPTIMIZATION_STANDARD | Optimizer.OPTIMIZATION_GROUPS);
+ Analyzer.determineGroups(root);
+
+ assertTrue(root.mSkipSolver);
+ assertEquals(root.mWidgetGroups.size(), 1);
+ assertTrue(root.mWidgetGroups.get(0).mSkipSolver);
+ }
+
+ @Test
+ public void skipSolverOneGroup() {
+ ConstraintWidgetContainer root = new ConstraintWidgetContainer(0, 0, 800, 800);
+ ConstraintWidget A = new ConstraintWidget(20, 20);
+ ConstraintWidget B = new ConstraintWidget(20, 20);
+ ConstraintWidget C = new ConstraintWidget(20, 20);
+
+ root.setDebugSolverName(root.getSystem(), "root");
+ A.setDebugSolverName(root.getSystem(), "A");
+ B.setDebugSolverName(root.getSystem(), "B");
+ C.setDebugSolverName(root.getSystem(), "C");
+
+ A.connect(Type.LEFT, root, Type.LEFT);
+ A.connect(Type.TOP, root, Type.TOP);
+ B.connect(Type.RIGHT, root, Type.RIGHT);
+ B.connect(Type.TOP, root, Type.TOP);
+ B.connect(Type.BOTTOM, C, Type.TOP);
+ C.connect(Type.RIGHT, root, Type.RIGHT);
+ C.connect(Type.BOTTOM, root, Type.BOTTOM);
+
+ root.add(A, B, C);
+ root.setOptimizationLevel(Optimizer.OPTIMIZATION_STANDARD | Optimizer.OPTIMIZATION_GROUPS);
+ Analyzer.determineGroups(root);
+
+ assertFalse(root.mSkipSolver);
+ assertEquals(root.mWidgetGroups.size(), 2);
+ assertTrue(root.mWidgetGroups.get(0).mSkipSolver);
+ assertFalse(root.mWidgetGroups.get(1).mSkipSolver);
+ }
+}