| // Copyright 2016 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 iconvg |
| |
| import ( |
| "image/color" |
| "math" |
| "testing" |
| ) |
| |
| var naturalTestCases = []struct { |
| in buffer |
| want uint32 |
| wantN int |
| }{{ |
| buffer{}, |
| 0, |
| 0, |
| }, { |
| buffer{0x28}, |
| 20, |
| 1, |
| }, { |
| buffer{0x59}, |
| 0, |
| 0, |
| }, { |
| buffer{0x59, 0x83}, |
| 8406, |
| 2, |
| }, { |
| buffer{0x07, 0x00, 0x80}, |
| 0, |
| 0, |
| }, { |
| buffer{0x07, 0x00, 0x80, 0x3f}, |
| 266338305, |
| 4, |
| }} |
| |
| func TestDecodeNatural(t *testing.T) { |
| for _, tc := range naturalTestCases { |
| got, gotN := tc.in.decodeNatural() |
| if got != tc.want || gotN != tc.wantN { |
| t.Errorf("in=%x: got %v, %d, want %v, %d", tc.in, got, gotN, tc.want, tc.wantN) |
| } |
| } |
| } |
| |
| func TestEncodeNatural(t *testing.T) { |
| for _, tc := range naturalTestCases { |
| if tc.wantN == 0 { |
| continue |
| } |
| var b buffer |
| b.encodeNatural(tc.want) |
| if got, want := string(b), string(tc.in); got != want { |
| t.Errorf("value=%v:\ngot % x\nwant % x", tc.want, got, want) |
| } |
| } |
| } |
| |
| var realTestCases = []struct { |
| in buffer |
| want float32 |
| wantN int |
| }{{ |
| buffer{0x28}, |
| 20, |
| 1, |
| }, { |
| buffer{0x59, 0x83}, |
| 8406, |
| 2, |
| }, { |
| buffer{0x07, 0x00, 0x80, 0x3f}, |
| 1.000000476837158203125, |
| 4, |
| }} |
| |
| func TestDecodeReal(t *testing.T) { |
| for _, tc := range realTestCases { |
| got, gotN := tc.in.decodeReal() |
| if got != tc.want || gotN != tc.wantN { |
| t.Errorf("in=%x: got %v, %d, want %v, %d", tc.in, got, gotN, tc.want, tc.wantN) |
| } |
| } |
| } |
| |
| func TestEncodeReal(t *testing.T) { |
| for _, tc := range realTestCases { |
| var b buffer |
| b.encodeReal(tc.want) |
| if got, want := string(b), string(tc.in); got != want { |
| t.Errorf("value=%v:\ngot % x\nwant % x", tc.want, got, want) |
| } |
| } |
| } |
| |
| var coordinateTestCases = []struct { |
| in buffer |
| want float32 |
| wantN int |
| }{{ |
| buffer{0x8e}, |
| 7, |
| 1, |
| }, { |
| buffer{0x81, 0x87}, |
| 7.5, |
| 2, |
| }, { |
| buffer{0x03, 0x00, 0xf0, 0x40}, |
| 7.5, |
| 4, |
| }, { |
| buffer{0x07, 0x00, 0xf0, 0x40}, |
| 7.5000019073486328125, |
| 4, |
| }} |
| |
| func TestDecodeCoordinate(t *testing.T) { |
| for _, tc := range coordinateTestCases { |
| got, gotN := tc.in.decodeCoordinate() |
| if got != tc.want || gotN != tc.wantN { |
| t.Errorf("in=%x: got %v, %d, want %v, %d", tc.in, got, gotN, tc.want, tc.wantN) |
| } |
| } |
| } |
| |
| func TestEncodeCoordinate(t *testing.T) { |
| for _, tc := range coordinateTestCases { |
| if tc.want == 7.5 && tc.wantN == 4 { |
| // 7.5 can be encoded in fewer than 4 bytes. |
| continue |
| } |
| var b buffer |
| b.encodeCoordinate(tc.want) |
| if got, want := string(b), string(tc.in); got != want { |
| t.Errorf("value=%v:\ngot % x\nwant % x", tc.want, got, want) |
| } |
| } |
| } |
| |
| func trunc(x float32) float32 { |
| u := math.Float32bits(x) |
| u &^= 0x03 |
| return math.Float32frombits(u) |
| } |
| |
| var zeroToOneTestCases = []struct { |
| in buffer |
| want float32 |
| wantN int |
| }{{ |
| buffer{0x0a}, |
| 1.0 / 24, |
| 1, |
| }, { |
| buffer{0x41, 0x1a}, |
| 1.0 / 9, |
| 2, |
| }, { |
| buffer{0x63, 0x0b, 0x36, 0x3b}, |
| trunc(1.0 / 360), |
| 4, |
| }} |
| |
| func TestDecodeZeroToOne(t *testing.T) { |
| for _, tc := range zeroToOneTestCases { |
| got, gotN := tc.in.decodeZeroToOne() |
| if got != tc.want || gotN != tc.wantN { |
| t.Errorf("in=%x: got %v, %d, want %v, %d", tc.in, got, gotN, tc.want, tc.wantN) |
| } |
| } |
| } |
| |
| func TestEncodeZeroToOne(t *testing.T) { |
| for _, tc := range zeroToOneTestCases { |
| var b buffer |
| b.encodeZeroToOne(tc.want) |
| if got, want := string(b), string(tc.in); got != want { |
| t.Errorf("value=%v:\ngot % x\nwant % x", tc.want, got, want) |
| } |
| } |
| } |
| |
| var colorTestCases = []struct { |
| in buffer |
| decode func(buffer) (Color, int) |
| encode func(*buffer, Color) |
| want Color |
| wantN int |
| }{{ |
| buffer{}, |
| buffer.decodeColor1, |
| (*buffer).encodeColor1, |
| Color{}, |
| 0, |
| }, { |
| buffer{0x00}, |
| buffer.decodeColor1, |
| (*buffer).encodeColor1, |
| RGBAColor(color.RGBA{0x00, 0x00, 0x00, 0xff}), |
| 1, |
| }, { |
| buffer{0x30}, |
| buffer.decodeColor1, |
| (*buffer).encodeColor1, |
| RGBAColor(color.RGBA{0x40, 0xff, 0xc0, 0xff}), |
| 1, |
| }, { |
| buffer{0x7c}, |
| buffer.decodeColor1, |
| (*buffer).encodeColor1, |
| RGBAColor(color.RGBA{0xff, 0xff, 0xff, 0xff}), |
| 1, |
| }, { |
| buffer{0x7d}, |
| buffer.decodeColor1, |
| (*buffer).encodeColor1, |
| RGBAColor(color.RGBA{0xc0, 0xc0, 0xc0, 0xc0}), |
| 1, |
| }, { |
| buffer{0x7e}, |
| buffer.decodeColor1, |
| (*buffer).encodeColor1, |
| RGBAColor(color.RGBA{0x80, 0x80, 0x80, 0x80}), |
| 1, |
| }, { |
| buffer{0x7f}, |
| buffer.decodeColor1, |
| (*buffer).encodeColor1, |
| RGBAColor(color.RGBA{0x00, 0x00, 0x00, 0x00}), |
| 1, |
| }, { |
| buffer{0x80}, |
| buffer.decodeColor1, |
| (*buffer).encodeColor1, |
| PaletteIndexColor(0x00), |
| 1, |
| }, { |
| buffer{0xbf}, |
| buffer.decodeColor1, |
| (*buffer).encodeColor1, |
| PaletteIndexColor(0x3f), |
| 1, |
| }, { |
| buffer{0xc0}, |
| buffer.decodeColor1, |
| (*buffer).encodeColor1, |
| CRegColor(0x00), |
| 1, |
| }, { |
| buffer{0xff}, |
| buffer.decodeColor1, |
| (*buffer).encodeColor1, |
| CRegColor(0x3f), |
| 1, |
| }, { |
| buffer{0x01}, |
| buffer.decodeColor2, |
| (*buffer).encodeColor2, |
| Color{}, |
| 0, |
| }, { |
| buffer{0x38, 0x0f}, |
| buffer.decodeColor2, |
| (*buffer).encodeColor2, |
| RGBAColor(color.RGBA{0x33, 0x88, 0x00, 0xff}), |
| 2, |
| }, { |
| buffer{0x00, 0x02}, |
| buffer.decodeColor3Direct, |
| (*buffer).encodeColor3Direct, |
| Color{}, |
| 0, |
| }, { |
| buffer{0x30, 0x66, 0x07}, |
| buffer.decodeColor3Direct, |
| (*buffer).encodeColor3Direct, |
| RGBAColor(color.RGBA{0x30, 0x66, 0x07, 0xff}), |
| 3, |
| }, { |
| buffer{0x00, 0x00, 0x03}, |
| buffer.decodeColor4, |
| (*buffer).encodeColor4, |
| Color{}, |
| 0, |
| }, { |
| buffer{0x30, 0x66, 0x07, 0x80}, |
| buffer.decodeColor4, |
| (*buffer).encodeColor4, |
| RGBAColor(color.RGBA{0x30, 0x66, 0x07, 0x80}), |
| 4, |
| }, { |
| buffer{0x00, 0x04}, |
| buffer.decodeColor3Indirect, |
| (*buffer).encodeColor3Indirect, |
| Color{}, |
| 0, |
| }, { |
| buffer{0x40, 0x7f, 0x82}, |
| buffer.decodeColor3Indirect, |
| (*buffer).encodeColor3Indirect, |
| BlendColor(0x40, 0x7f, 0x82), |
| 3, |
| }} |
| |
| func TestDecodeColor(t *testing.T) { |
| for _, tc := range colorTestCases { |
| got, gotN := tc.decode(tc.in) |
| if got != tc.want || gotN != tc.wantN { |
| t.Errorf("in=%x: got %v, %d, want %v, %d", tc.in, got, gotN, tc.want, tc.wantN) |
| } |
| } |
| } |
| |
| func TestEncodeColor(t *testing.T) { |
| for _, tc := range colorTestCases { |
| if tc.wantN == 0 { |
| continue |
| } |
| var b buffer |
| tc.encode(&b, tc.want) |
| if got, want := string(b), string(tc.in); got != want { |
| t.Errorf("value=%v:\ngot % x\nwant % x", tc.want, got, want) |
| } |
| } |
| } |