vendor: update all dependencies
This commit is contained in:
+73
@@ -5,12 +5,14 @@
|
||||
package precis
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"golang.org/x/text/internal/testtext"
|
||||
"golang.org/x/text/secure/bidirule"
|
||||
"golang.org/x/text/transform"
|
||||
)
|
||||
|
||||
type testCase struct {
|
||||
@@ -113,6 +115,8 @@ var enforceTestCases = []struct {
|
||||
{"α͵α", "α͵α", nil},
|
||||
{"͵͵α", "͵͵α", nil}, // The numeric sign is itself Greek.
|
||||
{"α͵͵α", "α͵͵α", nil},
|
||||
{"α͵͵", "", errContext},
|
||||
{"α͵͵a", "", errContext},
|
||||
}},
|
||||
|
||||
{"Context Rule 5+6", NewFreeform(), []testCase{
|
||||
@@ -318,3 +322,72 @@ func TestTransformMallocs(t *testing.T) {
|
||||
t.Errorf("got %f allocs, want 0", n)
|
||||
}
|
||||
}
|
||||
|
||||
func min(a, b int) int {
|
||||
if a < b {
|
||||
return a
|
||||
}
|
||||
return b
|
||||
}
|
||||
|
||||
// TestTransformerShortBuffers tests that the precis.Transformer implements the
|
||||
// spirit, not just the letter (the method signatures), of the
|
||||
// transform.Transformer interface.
|
||||
//
|
||||
// In particular, it tests that, if one or both of the dst or src buffers are
|
||||
// short, so that multiple Transform calls are required to complete the overall
|
||||
// transformation, the end result is identical to one Transform call with
|
||||
// sufficiently long buffers.
|
||||
func TestTransformerShortBuffers(t *testing.T) {
|
||||
srcUnit := []byte("a\u0300cce\u0301nts") // NFD normalization form.
|
||||
wantUnit := []byte("àccénts") // NFC normalization form.
|
||||
src := bytes.Repeat(srcUnit, 16)
|
||||
want := bytes.Repeat(wantUnit, 16)
|
||||
const long = 4096
|
||||
dst := make([]byte, long)
|
||||
|
||||
// 5, 7, 9, 11, 13, 16 and 17 are all pair-wise co-prime, which means that
|
||||
// slicing the dst and src buffers into 5, 7, 13 and 17 byte chunks will
|
||||
// fall at different places inside the repeated srcUnit's and wantUnit's.
|
||||
if len(srcUnit) != 11 || len(wantUnit) != 9 || len(src) > long || len(want) > long {
|
||||
t.Fatal("inconsistent lengths")
|
||||
}
|
||||
|
||||
tr := NewFreeform().NewTransformer()
|
||||
for _, deltaD := range []int{5, 7, 13, 17, long} {
|
||||
loop:
|
||||
for _, deltaS := range []int{5, 7, 13, 17, long} {
|
||||
tr.Reset()
|
||||
d0 := 0
|
||||
s0 := 0
|
||||
for {
|
||||
d1 := min(len(dst), d0+deltaD)
|
||||
s1 := min(len(src), s0+deltaS)
|
||||
nDst, nSrc, err := tr.Transform(dst[d0:d1:d1], src[s0:s1:s1], s1 == len(src))
|
||||
d0 += nDst
|
||||
s0 += nSrc
|
||||
if err == nil {
|
||||
break
|
||||
}
|
||||
if err == transform.ErrShortDst || err == transform.ErrShortSrc {
|
||||
continue
|
||||
}
|
||||
t.Errorf("deltaD=%d, deltaS=%d: %v", deltaD, deltaS, err)
|
||||
continue loop
|
||||
}
|
||||
if s0 != len(src) {
|
||||
t.Errorf("deltaD=%d, deltaS=%d: s0: got %d, want %d", deltaD, deltaS, s0, len(src))
|
||||
continue
|
||||
}
|
||||
if d0 != len(want) {
|
||||
t.Errorf("deltaD=%d, deltaS=%d: d0: got %d, want %d", deltaD, deltaS, d0, len(want))
|
||||
continue
|
||||
}
|
||||
got := dst[:d0]
|
||||
if !bytes.Equal(got, want) {
|
||||
t.Errorf("deltaD=%d, deltaS=%d:\ngot %q\nwant %q", deltaD, deltaS, got, want)
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+19
-29
@@ -322,33 +322,35 @@ func (c *checker) span(src []byte, atEOF bool) (n int, err error) {
|
||||
}
|
||||
return n, errDisallowedRune
|
||||
}
|
||||
doLookAhead := false
|
||||
if property(e) < c.p.class.validFrom {
|
||||
if d.rule == nil {
|
||||
return n, errDisallowedRune
|
||||
}
|
||||
doLookAhead, err := d.rule(c.beforeBits)
|
||||
doLookAhead, err = d.rule(c.beforeBits)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
if doLookAhead {
|
||||
c.beforeBits &= d.keep
|
||||
c.beforeBits |= d.set
|
||||
// We may still have a lookahead rule which we will require to
|
||||
// complete (by checking termBits == 0) before setting the new
|
||||
// bits.
|
||||
if c.termBits != 0 && (!c.checkLookahead() || c.termBits == 0) {
|
||||
return n, err
|
||||
}
|
||||
c.termBits = d.term
|
||||
c.acceptBits = d.accept
|
||||
n += sz
|
||||
continue
|
||||
}
|
||||
}
|
||||
c.beforeBits &= d.keep
|
||||
c.beforeBits |= d.set
|
||||
if c.termBits != 0 && !c.checkLookahead() {
|
||||
return n, errContext
|
||||
if c.termBits != 0 {
|
||||
// We are currently in an unterminated lookahead.
|
||||
if c.beforeBits&c.termBits != 0 {
|
||||
c.termBits = 0
|
||||
c.acceptBits = 0
|
||||
} else if c.beforeBits&c.acceptBits == 0 {
|
||||
// Invalid continuation of the unterminated lookahead sequence.
|
||||
return n, errContext
|
||||
}
|
||||
}
|
||||
if doLookAhead {
|
||||
if c.termBits != 0 {
|
||||
// A previous lookahead run has not been terminated yet.
|
||||
return n, errContext
|
||||
}
|
||||
c.termBits = d.term
|
||||
c.acceptBits = d.accept
|
||||
}
|
||||
n += sz
|
||||
}
|
||||
@@ -358,18 +360,6 @@ func (c *checker) span(src []byte, atEOF bool) (n int, err error) {
|
||||
return n, err
|
||||
}
|
||||
|
||||
func (c *checker) checkLookahead() bool {
|
||||
switch {
|
||||
case c.beforeBits&c.termBits != 0:
|
||||
c.termBits = 0
|
||||
c.acceptBits = 0
|
||||
case c.beforeBits&c.acceptBits != 0:
|
||||
default:
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// TODO: we may get rid of this transform if transform.Chain understands
|
||||
// something like a Spanner interface.
|
||||
func (c checker) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
|
||||
|
||||
Reference in New Issue
Block a user