1
2
3
4
5 package bmp
6
7 import (
8 "bytes"
9 "fmt"
10 "image"
11 "image/draw"
12 "io/ioutil"
13 "os"
14 "testing"
15 "time"
16 )
17
18 func openImage(filename string) (image.Image, error) {
19 f, err := os.Open(testdataDir + filename)
20 if err != nil {
21 return nil, err
22 }
23 defer f.Close()
24 return Decode(f)
25 }
26
27 func convertToRGBA(in image.Image) image.Image {
28 b := in.Bounds()
29 out := image.NewRGBA(b)
30 draw.Draw(out, b, in, b.Min, draw.Src)
31 return out
32 }
33
34 func convertToNRGBA(in image.Image) image.Image {
35 b := in.Bounds()
36 out := image.NewNRGBA(b)
37 draw.Draw(out, b, in, b.Min, draw.Src)
38 return out
39 }
40
41 func TestEncode(t *testing.T) {
42 testCases := []string{
43 "video-001.bmp",
44 "yellow_rose-small.bmp",
45 }
46
47 for _, tc := range testCases {
48 img0, err := openImage(tc)
49 if err != nil {
50 t.Errorf("%s: Open BMP: %v", tc, err)
51 continue
52 }
53
54 buf := new(bytes.Buffer)
55 err = Encode(buf, img0)
56 if err != nil {
57 t.Errorf("%s: Encode BMP: %v", tc, err)
58 continue
59 }
60
61 img1, err := Decode(buf)
62 if err != nil {
63 t.Errorf("%s: Decode BMP: %v", tc, err)
64 continue
65 }
66
67 err = compare(img0, img1)
68 if err != nil {
69 t.Errorf("%s: Compare BMP: %v", tc, err)
70 continue
71 }
72
73 buf2 := new(bytes.Buffer)
74 rgba := convertToRGBA(img0)
75 err = Encode(buf2, rgba)
76 if err != nil {
77 t.Errorf("%s: Encode pre-multiplied BMP: %v", tc, err)
78 continue
79 }
80
81 img2, err := Decode(buf2)
82 if err != nil {
83 t.Errorf("%s: Decode pre-multiplied BMP: %v", tc, err)
84 continue
85 }
86
87
88
89 img3 := convertToNRGBA(rgba)
90
91 err = compare(img3, img2)
92 if err != nil {
93 t.Errorf("%s: Compare pre-multiplied BMP: %v", tc, err)
94 }
95 }
96 }
97
98
99
100
101 func TestZeroWidthVeryLargeHeight(t *testing.T) {
102 c := make(chan error, 1)
103 go func() {
104 b := image.Rect(0, 0, 0, 0x3fffffff)
105 var buf bytes.Buffer
106 if err := Encode(&buf, image.NewRGBA(b)); err != nil {
107 c <- err
108 return
109 }
110 m, err := Decode(&buf)
111 if err != nil {
112 c <- err
113 return
114 }
115 if got := m.Bounds(); got != b {
116 c <- fmt.Errorf("bounds: got %v, want %v", got, b)
117 return
118 }
119 c <- nil
120 }()
121 select {
122 case err := <-c:
123 if err != nil {
124 t.Fatal(err)
125 }
126 case <-time.After(3 * time.Second):
127 t.Fatalf("timed out")
128 }
129 }
130
131
132 func BenchmarkEncode(b *testing.B) {
133 img, err := openImage("video-001.bmp")
134 if err != nil {
135 b.Fatal(err)
136 }
137 s := img.Bounds().Size()
138 b.SetBytes(int64(s.X * s.Y * 4))
139 b.ResetTimer()
140 for i := 0; i < b.N; i++ {
141 Encode(ioutil.Discard, img)
142 }
143 }
144
View as plain text