diff --git a/internal/restorable/export_test.go b/internal/restorable/export_test.go new file mode 100644 index 000000000..533a82387 --- /dev/null +++ b/internal/restorable/export_test.go @@ -0,0 +1,23 @@ +// Copyright 2023 The Ebitengine Authors +// +// 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 restorable + +import ( + "image" +) + +func RemoveDuplicatedRegions(regions []image.Rectangle) []image.Rectangle { + return removeDuplicatedRegions(regions) +} diff --git a/internal/restorable/rect.go b/internal/restorable/pixelrecords.go similarity index 100% rename from internal/restorable/rect.go rename to internal/restorable/pixelrecords.go diff --git a/internal/restorable/rect_test.go b/internal/restorable/rect_test.go new file mode 100644 index 000000000..494f59573 --- /dev/null +++ b/internal/restorable/rect_test.go @@ -0,0 +1,131 @@ +// Copyright 2023 The Ebitengine Authors +// +// 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 restorable_test + +import ( + "image" + "testing" + + "github.com/hajimehoshi/ebiten/v2/internal/restorable" +) + +func areEqualRectangles(a, b []image.Rectangle) bool { + if len(a) != len(b) { + return false + } + + for i := range a { + if a[i] != b[i] { + return false + } + } + + return true +} + +func TestRemoveDuplicatedRegions(t *testing.T) { + cases := []struct { + In []image.Rectangle + Out []image.Rectangle + }{ + { + In: nil, + Out: nil, + }, + { + In: []image.Rectangle{ + image.Rect(0, 0, 2, 2), + }, + Out: []image.Rectangle{ + image.Rect(0, 0, 2, 2), + }, + }, + { + In: []image.Rectangle{ + image.Rect(0, 0, 2, 2), + image.Rect(0, 0, 1, 1), + }, + Out: []image.Rectangle{ + image.Rect(0, 0, 2, 2), + image.Rect(0, 0, 1, 1), + }, + }, + { + In: []image.Rectangle{ + image.Rect(0, 0, 1, 1), + image.Rect(0, 0, 2, 2), + }, + Out: []image.Rectangle{ + image.Rect(0, 0, 2, 2), + }, + }, + { + In: []image.Rectangle{ + image.Rect(0, 0, 1, 3), + image.Rect(0, 0, 2, 2), + image.Rect(0, 0, 3, 1), + }, + Out: []image.Rectangle{ + image.Rect(0, 0, 1, 3), + image.Rect(0, 0, 2, 2), + image.Rect(0, 0, 3, 1), + }, + }, + { + In: []image.Rectangle{ + image.Rect(0, 0, 1, 3), + image.Rect(0, 0, 2, 2), + image.Rect(0, 0, 3, 1), + image.Rect(0, 0, 4, 4), + }, + Out: []image.Rectangle{ + image.Rect(0, 0, 4, 4), + }, + }, + { + In: []image.Rectangle{ + image.Rect(0, 0, 1, 3), + image.Rect(0, 0, 2, 2), + image.Rect(0, 0, 3, 1), + image.Rect(0, 0, 4, 4), + image.Rect(1, 1, 2, 2), + }, + Out: []image.Rectangle{ + image.Rect(0, 0, 4, 4), + image.Rect(1, 1, 2, 2), + }, + }, + { + In: []image.Rectangle{ + image.Rect(0, 0, 1, 3), + image.Rect(0, 0, 2, 2), + image.Rect(0, 0, 3, 1), + image.Rect(0, 0, 4, 4), + image.Rect(0, 0, 5, 5), + }, + Out: []image.Rectangle{ + image.Rect(0, 0, 5, 5), + }, + }, + } + + for _, c := range cases { + got := restorable.RemoveDuplicatedRegions(c.In) + want := c.Out + if !areEqualRectangles(got, want) { + t.Errorf("restorable.RemoveDuplicatedRegions(%#v): got: %#v, want: %#v", c.In, got, want) + } + } +}