aboutsummaryrefslogtreecommitdiffstats
path: root/lay/strain/solve_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'lay/strain/solve_test.go')
-rw-r--r--lay/strain/solve_test.go85
1 files changed, 75 insertions, 10 deletions
diff --git a/lay/strain/solve_test.go b/lay/strain/solve_test.go
index 6281124..4c0cc83 100644
--- a/lay/strain/solve_test.go
+++ b/lay/strain/solve_test.go
@@ -80,8 +80,8 @@ func TestSingleField(t *testing.T) {
// Setup
constraints := make(chan strain.Constraint)
st := newSolverTest(t, []<-chan strain.Constraint{constraints})
- defer st.Close()
defer close(constraints)
+ defer st.Close()
// Add layout constraints
container := st.Solver.Container()
@@ -107,10 +107,10 @@ func TestFieldMinSize(t *testing.T) {
// Setup
constraints := make(chan strain.Constraint)
st := newSolverTest(t, []<-chan strain.Constraint{constraints})
- defer st.Close()
defer close(constraints)
+ defer st.Close()
- // Add widget constraints
+ // Add field constraints
minWidth := unit.Value{32, unit.Ch}
minHeight := unit.Value{1.5, unit.Em}
constraints <- strain.Constraint{strain.Width, casso.GTE, minWidth}
@@ -140,26 +140,91 @@ func TestFieldMinSizeLargerThanContainer(t *testing.T) {
// Setup
constraints := make(chan strain.Constraint)
st := newSolverTest(t, []<-chan strain.Constraint{constraints})
- defer st.Close()
defer close(constraints)
+ defer st.Close()
- // Add widget constraints
+ // Add field constraints
constraints <- strain.Constraint{strain.Width, casso.GTE, unit.Value{200, unit.Px}}
constraints <- strain.Constraint{strain.Height, casso.GTE, unit.Value{300, unit.Px}}
- synctest.Wait()
// Solve
container := image.Rect(12, 34, 100, 200)
+ synctest.Wait()
st.solve(container, validateEq([]image.Rectangle{container}))
})
}
-// Solver with only layout constaints, no field constraints.
-func TestLayConstrs(t *testing.T) {
+// Fields arranged as rows.
+func TestRows(t *testing.T) {
t.Parallel()
+ synctest.Test(t, func(t *testing.T) {
+ // Setup
+ nrows := 8
+ constraintss := make([]chan strain.Constraint, nrows)
+ for i := range constraintss {
+ constraintss[i] = make(chan strain.Constraint)
+ }
+ st := newSolverTest(t, castRx(constraintss))
+ defer func() {
+ for _, c := range constraintss {
+ close(c)
+ }
+ st.Close()
+ }()
+
+ // Add layout constraints
+ require.NoError(t, st.Solver.AddConstraintPt(casso.EQ, st.Solver.Field(0).Origin, st.Solver.Container().Origin)) // start from top left corner
+ fieldHeights := make([]casso.Term, nrows)
+ for i := 0; i < nrows; i++ {
+ fieldHeights[i] = st.Field(i).Size.Y.T(1)
+ container := st.Solver.Container()
+ f := st.Solver.Field(i)
+ require.NoError(t, st.Solver.AddConstraint(casso.EQ, 0, f.Size.X.T(1), container.Size.X.T(-1))) // span full width
+ }
+ terms := append(fieldHeights, st.Solver.Container().Size.Y.T(-1)) // ∑field[i].height <= container.height
+ require.NoError(t, st.Solver.AddConstraint(casso.LTE, 0, terms...))
+ for i := 1; i < nrows; i++ {
+ f0, f1 := st.Solver.Field(i-1), st.Solver.Field(i)
+ require.NoError(t, st.Solver.AddConstraint(casso.EQ, 0, f1.Origin.Y.T(1), f0.Origin.Y.T(-1), f0.Size.Y.T(-1))) // in order
+ require.NoError(t, st.Solver.AddConstraintPt(casso.EQ, f1.Size, f0.Size)) // same size
+ }
- st := newSolverTest(t, nil)
- defer st.Close()
+ // Add field constraints
+ var rowHeight int
+ for i, c := range constraintss {
+ rowHeight = 2 * i
+ c <- strain.Constraint{strain.Width, casso.GTE, unit.Value{float64(16 + i), unit.Ch}}
+ c <- strain.Constraint{strain.Height, casso.GTE, unit.Value{float64(rowHeight), unit.Px}}
+ }
+
+ // Solve
+ container := image.Rect(123, 234, 567, 678)
+ synctest.Wait()
+ fields, err := st.Solver.Solve(container)
+ if err != nil {
+ t.Fatal(err)
+ }
+ require.EqualValues(t, nrows, len(fields), "wrong number of fields")
+ for _, field := range fields {
+ t.Logf("%v (%d %d)\n", field, field.Dx(), field.Dy())
+ }
+ for i, field := range fields {
+ require.Equal(t, container.Min.X, field.Min.X, "not left-aligned with container")
+ require.Equal(t, container.Min.Y+i*rowHeight, field.Min.Y, "wrong y position")
+ require.Equal(t, container.Dx(), field.Dx(), "wrong width")
+ require.Equal(t, rowHeight, field.Dy(), "wrong height")
+ }
+ })
+}
+func TestSolver(t *testing.T) {
t.Fail() // TODO: more tests
}
+
+func castRx[T any](cs []chan T) []<-chan T {
+ rcs := make([]<-chan T, len(cs))
+ for i, c := range cs {
+ rcs[i] = c
+ }
+ return rcs
+}