utils_test.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. package imaging
  2. import (
  3. "image"
  4. "math"
  5. "runtime"
  6. "testing"
  7. )
  8. var (
  9. testdataBranchesJPG = mustOpen("testdata/branches.jpg")
  10. testdataBranchesPNG = mustOpen("testdata/branches.png")
  11. testdataFlowersSmallPNG = mustOpen("testdata/flowers_small.png")
  12. )
  13. func mustOpen(filename string) image.Image {
  14. img, err := Open(filename)
  15. if err != nil {
  16. panic(err)
  17. }
  18. return img
  19. }
  20. func TestParallel(t *testing.T) {
  21. for _, n := range []int{0, 1, 10, 100, 1000} {
  22. for _, p := range []int{1, 2, 4, 8, 16, 100} {
  23. if !testParallelN(n, p) {
  24. t.Fatalf("test [parallel %d %d] failed", n, p)
  25. }
  26. }
  27. }
  28. }
  29. func testParallelN(n, procs int) bool {
  30. data := make([]bool, n)
  31. before := runtime.GOMAXPROCS(0)
  32. runtime.GOMAXPROCS(procs)
  33. parallel(0, n, func(is <-chan int) {
  34. for i := range is {
  35. data[i] = true
  36. }
  37. })
  38. runtime.GOMAXPROCS(before)
  39. for i := 0; i < n; i++ {
  40. if !data[i] {
  41. return false
  42. }
  43. }
  44. return true
  45. }
  46. func TestClamp(t *testing.T) {
  47. testCases := []struct {
  48. f float64
  49. u uint8
  50. }{
  51. {0, 0},
  52. {255, 255},
  53. {128, 128},
  54. {0.49, 0},
  55. {0.50, 1},
  56. {254.9, 255},
  57. {254.0, 254},
  58. {256, 255},
  59. {2500, 255},
  60. {-10, 0},
  61. {127.6, 128},
  62. }
  63. for _, tc := range testCases {
  64. if clamp(tc.f) != tc.u {
  65. t.Fatalf("test [clamp %v %v] failed: %v", tc.f, tc.u, clamp(tc.f))
  66. }
  67. }
  68. }
  69. func TestReverse(t *testing.T) {
  70. testCases := []struct {
  71. pix []uint8
  72. want []uint8
  73. }{
  74. {
  75. pix: []uint8{},
  76. want: []uint8{},
  77. },
  78. {
  79. pix: []uint8{1, 2, 3, 4},
  80. want: []uint8{1, 2, 3, 4},
  81. },
  82. {
  83. pix: []uint8{1, 2, 3, 4, 5, 6, 7, 8},
  84. want: []uint8{5, 6, 7, 8, 1, 2, 3, 4},
  85. },
  86. {
  87. pix: []uint8{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12},
  88. want: []uint8{9, 10, 11, 12, 5, 6, 7, 8, 1, 2, 3, 4},
  89. },
  90. }
  91. for _, tc := range testCases {
  92. t.Run("", func(t *testing.T) {
  93. reverse(tc.pix)
  94. if !compareBytes(tc.pix, tc.want, 0) {
  95. t.Fatalf("got pix %v want %v", tc.pix, tc.want)
  96. }
  97. })
  98. }
  99. }
  100. func compareNRGBA(img1, img2 *image.NRGBA, delta int) bool {
  101. if !img1.Rect.Eq(img2.Rect) {
  102. return false
  103. }
  104. return compareBytes(img1.Pix, img2.Pix, delta)
  105. }
  106. func compareBytes(a, b []uint8, delta int) bool {
  107. if len(a) != len(b) {
  108. return false
  109. }
  110. for i := 0; i < len(a); i++ {
  111. if absint(int(a[i])-int(b[i])) > delta {
  112. return false
  113. }
  114. }
  115. return true
  116. }
  117. func compareFloat64(a, b, delta float64) bool {
  118. return math.Abs(a-b) <= delta
  119. }
  120. var rgbHSLTestCases = []struct {
  121. r, g, b uint8
  122. h, s, l float64
  123. }{
  124. {
  125. r: 255,
  126. g: 0,
  127. b: 0,
  128. h: 0.000,
  129. s: 1.000,
  130. l: 0.500,
  131. },
  132. {
  133. r: 191,
  134. g: 191,
  135. b: 0,
  136. h: 0.167,
  137. s: 1.000,
  138. l: 0.375,
  139. },
  140. {
  141. r: 0,
  142. g: 128,
  143. b: 0,
  144. h: 0.333,
  145. s: 1.000,
  146. l: 0.251,
  147. },
  148. {
  149. r: 128,
  150. g: 255,
  151. b: 255,
  152. h: 0.500,
  153. s: 1.000,
  154. l: 0.751,
  155. },
  156. {
  157. r: 128,
  158. g: 128,
  159. b: 255,
  160. h: 0.667,
  161. s: 1.000,
  162. l: 0.751,
  163. },
  164. {
  165. r: 191,
  166. g: 64,
  167. b: 191,
  168. h: 0.833,
  169. s: 0.498,
  170. l: 0.500,
  171. },
  172. {
  173. r: 160,
  174. g: 164,
  175. b: 36,
  176. h: 0.172,
  177. s: 0.640,
  178. l: 0.392,
  179. },
  180. {
  181. r: 65,
  182. g: 27,
  183. b: 234,
  184. h: 0.697,
  185. s: 0.831,
  186. l: 0.512,
  187. },
  188. {
  189. r: 30,
  190. g: 172,
  191. b: 65,
  192. h: 0.374,
  193. s: 0.703,
  194. l: 0.396,
  195. },
  196. {
  197. r: 240,
  198. g: 200,
  199. b: 14,
  200. h: 0.137,
  201. s: 0.890,
  202. l: 0.498,
  203. },
  204. {
  205. r: 180,
  206. g: 48,
  207. b: 229,
  208. h: 0.788,
  209. s: 0.777,
  210. l: 0.543,
  211. },
  212. {
  213. r: 237,
  214. g: 119,
  215. b: 81,
  216. h: 0.040,
  217. s: 0.813,
  218. l: 0.624,
  219. },
  220. {
  221. r: 254,
  222. g: 248,
  223. b: 136,
  224. h: 0.158,
  225. s: 0.983,
  226. l: 0.765,
  227. },
  228. {
  229. r: 25,
  230. g: 203,
  231. b: 151,
  232. h: 0.451,
  233. s: 0.781,
  234. l: 0.447,
  235. },
  236. {
  237. r: 54,
  238. g: 38,
  239. b: 152,
  240. h: 0.690,
  241. s: 0.600,
  242. l: 0.373,
  243. },
  244. {
  245. r: 126,
  246. g: 126,
  247. b: 184,
  248. h: 0.667,
  249. s: 0.290,
  250. l: 0.608,
  251. },
  252. }
  253. func TestRGBToHSL(t *testing.T) {
  254. for _, tc := range rgbHSLTestCases {
  255. t.Run("", func(t *testing.T) {
  256. h, s, l := rgbToHSL(tc.r, tc.g, tc.b)
  257. if !compareFloat64(h, tc.h, 0.001) || !compareFloat64(s, tc.s, 0.001) || !compareFloat64(l, tc.l, 0.001) {
  258. t.Fatalf("(%d, %d, %d): got (%.3f, %.3f, %.3f) want (%.3f, %.3f, %.3f)", tc.r, tc.g, tc.b, h, s, l, tc.h, tc.s, tc.l)
  259. }
  260. })
  261. }
  262. }
  263. func TestHSLToRGB(t *testing.T) {
  264. for _, tc := range rgbHSLTestCases {
  265. t.Run("", func(t *testing.T) {
  266. r, g, b := hslToRGB(tc.h, tc.s, tc.l)
  267. if r != tc.r || g != tc.g || b != tc.b {
  268. t.Fatalf("(%.3f, %.3f, %.3f): got (%d, %d, %d) want (%d, %d, %d)", tc.h, tc.s, tc.l, r, g, b, tc.r, tc.g, tc.b)
  269. }
  270. })
  271. }
  272. }