| // 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 font |
| |
| import ( |
| "image" |
| "strings" |
| "testing" |
| |
| "golang.org/x/image/math/fixed" |
| ) |
| |
| const toyAdvance = fixed.Int26_6(10 << 6) |
| |
| type toyFace struct{} |
| |
| func (toyFace) Close() error { |
| return nil |
| } |
| |
| func (toyFace) Glyph(dot fixed.Point26_6, r rune) (image.Rectangle, image.Image, image.Point, fixed.Int26_6, bool) { |
| panic("unimplemented") |
| } |
| |
| func (toyFace) GlyphBounds(r rune) (fixed.Rectangle26_6, fixed.Int26_6, bool) { |
| return fixed.Rectangle26_6{ |
| Min: fixed.P(2, 0), |
| Max: fixed.P(6, 1), |
| }, toyAdvance, true |
| } |
| |
| func (toyFace) GlyphAdvance(r rune) (fixed.Int26_6, bool) { |
| return toyAdvance, true |
| } |
| |
| func (toyFace) Kern(r0, r1 rune) fixed.Int26_6 { |
| return 0 |
| } |
| |
| func (toyFace) Metrics() Metrics { |
| return Metrics{} |
| } |
| |
| func TestBound(t *testing.T) { |
| wantBounds := []fixed.Rectangle26_6{ |
| {Min: fixed.P(0, 0), Max: fixed.P(0, 0)}, |
| {Min: fixed.P(2, 0), Max: fixed.P(6, 1)}, |
| {Min: fixed.P(2, 0), Max: fixed.P(16, 1)}, |
| {Min: fixed.P(2, 0), Max: fixed.P(26, 1)}, |
| } |
| |
| for i, wantBound := range wantBounds { |
| s := strings.Repeat("x", i) |
| gotBound, gotAdvance := BoundString(toyFace{}, s) |
| if gotBound != wantBound { |
| t.Errorf("i=%d: bound: got %v, want %v", i, gotBound, wantBound) |
| } |
| wantAdvance := toyAdvance * fixed.Int26_6(i) |
| if gotAdvance != wantAdvance { |
| t.Errorf("i=%d: advance: got %v, want %v", i, gotAdvance, wantAdvance) |
| } |
| } |
| } |