mirror of
https://github.com/golang/go
synced 2024-10-03 06:21:21 -06:00
84c7a6583a
if their nominal Min and Max points differ. This is a behavior change, but arguably a bug fix, as Eq wasn't previously consistent with In, and the concept of a rectangle being a set of points. This is demonstrated by the new geom_test.go test. It does mean that r.Eq(s) no longer implies that Inset'ting both r and s with a negative inset results in two rectangles that are still Eq, but that seems acceptable to me. The previous behavior is still available as "r == s". Also clarify the image.Rect doc comment when the inputs are non-canonical. Also simplify the Point and Rectangle Eq implementations dating from before Go 1.0, when you couldn't compare structs via the == operator. Change-Id: Ic39e628db31dc5fe5220f4b444e6d5000eeace5b Reviewed-on: https://go-review.googlesource.com/5006 Reviewed-by: Rob Pike <r@golang.org>
116 lines
3.0 KiB
Go
116 lines
3.0 KiB
Go
// Copyright 2015 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package image
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
)
|
|
|
|
func TestRectangle(t *testing.T) {
|
|
// in checks that every point in f is in g.
|
|
in := func(f, g Rectangle) error {
|
|
if !f.In(g) {
|
|
return fmt.Errorf("f=%s, f.In(%s): got false, want true", f, g)
|
|
}
|
|
for y := f.Min.Y; y < f.Max.Y; y++ {
|
|
for x := f.Min.X; x < f.Max.X; x++ {
|
|
p := Point{x, y}
|
|
if !p.In(g) {
|
|
return fmt.Errorf("p=%s, p.In(%s): got false, want true", p, g)
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
rects := []Rectangle{
|
|
Rect(0, 0, 10, 10),
|
|
Rect(1, 2, 3, 4),
|
|
Rect(4, 6, 10, 10),
|
|
Rect(2, 3, 12, 5),
|
|
Rect(-1, -2, 0, 0),
|
|
Rect(-1, -2, 4, 6),
|
|
Rect(-10, -20, 30, 40),
|
|
Rect(8, 8, 8, 8),
|
|
Rect(88, 88, 88, 88),
|
|
Rect(6, 5, 4, 3),
|
|
}
|
|
|
|
// r.Eq(s) should be equivalent to every point in r being in s, and every
|
|
// point in s being in r.
|
|
for _, r := range rects {
|
|
for _, s := range rects {
|
|
got := r.Eq(s)
|
|
want := in(r, s) == nil && in(s, r) == nil
|
|
if got != want {
|
|
t.Errorf("Eq: r=%s, s=%s: got %t, want %t", r, s, got, want)
|
|
}
|
|
}
|
|
}
|
|
|
|
// The intersection should be the largest rectangle a such that every point
|
|
// in a is both in r and in s.
|
|
for _, r := range rects {
|
|
for _, s := range rects {
|
|
a := r.Intersect(s)
|
|
if err := in(a, r); err != nil {
|
|
t.Errorf("Intersect: r=%s, s=%s, a=%s, a not in r: %v", r, s, a, err)
|
|
}
|
|
if err := in(a, s); err != nil {
|
|
t.Errorf("Intersect: r=%s, s=%s, a=%s, a not in s: %v", r, s, a, err)
|
|
}
|
|
if a.Empty() == r.Overlaps(s) {
|
|
t.Errorf("Intersect: r=%s, s=%s, a=%s: empty=%t same as overlaps=%t",
|
|
r, s, a, a.Empty(), r.Overlaps(s))
|
|
}
|
|
largerThanA := [4]Rectangle{a, a, a, a}
|
|
largerThanA[0].Min.X--
|
|
largerThanA[1].Min.Y--
|
|
largerThanA[2].Max.X++
|
|
largerThanA[3].Max.Y++
|
|
for i, b := range largerThanA {
|
|
if b.Empty() {
|
|
// b isn't actually larger than a.
|
|
continue
|
|
}
|
|
if in(b, r) == nil && in(b, s) == nil {
|
|
t.Errorf("Intersect: r=%s, s=%s, a=%s, b=%s, i=%d: intersection could be larger",
|
|
r, s, a, b, i)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// The union should be the smallest rectangle a such that every point in r
|
|
// is in a and every point in s is in a.
|
|
for _, r := range rects {
|
|
for _, s := range rects {
|
|
a := r.Union(s)
|
|
if err := in(r, a); err != nil {
|
|
t.Errorf("Union: r=%s, s=%s, a=%s, r not in a: %v", r, s, a, err)
|
|
}
|
|
if err := in(s, a); err != nil {
|
|
t.Errorf("Union: r=%s, s=%s, a=%s, s not in a: %v", r, s, a, err)
|
|
}
|
|
if a.Empty() {
|
|
// You can't get any smaller than a.
|
|
continue
|
|
}
|
|
smallerThanA := [4]Rectangle{a, a, a, a}
|
|
smallerThanA[0].Min.X++
|
|
smallerThanA[1].Min.Y++
|
|
smallerThanA[2].Max.X--
|
|
smallerThanA[3].Max.Y--
|
|
for i, b := range smallerThanA {
|
|
if in(r, b) == nil && in(s, b) == nil {
|
|
t.Errorf("Union: r=%s, s=%s, a=%s, b=%s, i=%d: union could be smaller",
|
|
r, s, a, b, i)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|