summaryrefslogtreecommitdiff
path: root/vendor/golang.org/x/text/runes/cond_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/golang.org/x/text/runes/cond_test.go')
-rw-r--r--vendor/golang.org/x/text/runes/cond_test.go282
1 files changed, 282 insertions, 0 deletions
diff --git a/vendor/golang.org/x/text/runes/cond_test.go b/vendor/golang.org/x/text/runes/cond_test.go
new file mode 100644
index 0000000..44cd36d
--- /dev/null
+++ b/vendor/golang.org/x/text/runes/cond_test.go
@@ -0,0 +1,282 @@
+// Copyright 2015 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 runes
+
+import (
+ "strings"
+ "testing"
+ "unicode"
+
+ "golang.org/x/text/cases"
+ "golang.org/x/text/language"
+ "golang.org/x/text/transform"
+)
+
+var (
+ toUpper = cases.Upper(language.Und)
+ toLower = cases.Lower(language.Und)
+)
+
+type spanformer interface {
+ transform.SpanningTransformer
+}
+
+func TestPredicate(t *testing.T) {
+ testConditional(t, func(rt *unicode.RangeTable, t, f spanformer) spanformer {
+ return If(Predicate(func(r rune) bool {
+ return unicode.Is(rt, r)
+ }), t, f)
+ })
+}
+
+func TestIn(t *testing.T) {
+ testConditional(t, func(rt *unicode.RangeTable, t, f spanformer) spanformer {
+ return If(In(rt), t, f)
+ })
+}
+
+func TestNotIn(t *testing.T) {
+ testConditional(t, func(rt *unicode.RangeTable, t, f spanformer) spanformer {
+ return If(NotIn(rt), f, t)
+ })
+}
+
+func testConditional(t *testing.T, f func(rt *unicode.RangeTable, t, f spanformer) spanformer) {
+ lower := f(unicode.Latin, toLower, toLower)
+
+ for i, tt := range []transformTest{{
+ desc: "empty",
+ szDst: large,
+ atEOF: true,
+ in: "",
+ out: "",
+ outFull: "",
+ t: lower,
+ }, {
+ desc: "small",
+ szDst: 1,
+ atEOF: true,
+ in: "B",
+ out: "b",
+ outFull: "b",
+ errSpan: transform.ErrEndOfSpan,
+ t: lower,
+ }, {
+ desc: "short dst",
+ szDst: 2,
+ atEOF: true,
+ in: "AAA",
+ out: "aa",
+ outFull: "aaa",
+ err: transform.ErrShortDst,
+ errSpan: transform.ErrEndOfSpan,
+ t: lower,
+ }, {
+ desc: "short dst writing error",
+ szDst: 1,
+ atEOF: false,
+ in: "A\x80",
+ out: "a",
+ outFull: "a\x80",
+ err: transform.ErrShortDst,
+ errSpan: transform.ErrEndOfSpan,
+ t: lower,
+ }, {
+ desc: "short dst writing incomplete rune",
+ szDst: 2,
+ atEOF: true,
+ in: "Σ\xc2",
+ out: "Σ",
+ outFull: "Σ\xc2",
+ err: transform.ErrShortDst,
+ t: f(unicode.Latin, toLower, nil),
+ }, {
+ desc: "short dst, longer",
+ szDst: 5,
+ atEOF: true,
+ in: "Hellø",
+ out: "Hell",
+ outFull: "Hellø",
+ err: transform.ErrShortDst,
+ // idem is used to test short buffers by forcing processing of full-rune increments.
+ t: f(unicode.Latin, Map(idem), nil),
+ }, {
+ desc: "short dst, longer, writing error",
+ szDst: 6,
+ atEOF: false,
+ in: "\x80Hello\x80",
+ out: "\x80Hello",
+ outFull: "\x80Hello\x80",
+ err: transform.ErrShortDst,
+ t: f(unicode.Latin, Map(idem), nil),
+ }, {
+ desc: "short src",
+ szDst: 2,
+ atEOF: false,
+ in: "A\xc2",
+ out: "a",
+ outFull: "a\xc2",
+ err: transform.ErrShortSrc,
+ errSpan: transform.ErrEndOfSpan,
+ t: lower,
+ }, {
+ desc: "short src no change",
+ szDst: 2,
+ atEOF: false,
+ in: "a\xc2",
+ out: "a",
+ outFull: "a\xc2",
+ err: transform.ErrShortSrc,
+ errSpan: transform.ErrShortSrc,
+ nSpan: 1,
+ t: lower,
+ }, {
+ desc: "invalid input, atEOF",
+ szDst: large,
+ atEOF: true,
+ in: "\x80",
+ out: "\x80",
+ outFull: "\x80",
+ t: lower,
+ }, {
+ desc: "invalid input, !atEOF",
+ szDst: large,
+ atEOF: false,
+ in: "\x80",
+ out: "\x80",
+ outFull: "\x80",
+ t: lower,
+ }, {
+ desc: "invalid input, incomplete rune atEOF",
+ szDst: large,
+ atEOF: true,
+ in: "\xc2",
+ out: "\xc2",
+ outFull: "\xc2",
+ t: lower,
+ }, {
+ desc: "nop",
+ szDst: large,
+ atEOF: true,
+ in: "Hello World!",
+ out: "Hello World!",
+ outFull: "Hello World!",
+ t: f(unicode.Latin, nil, nil),
+ }, {
+ desc: "nop in",
+ szDst: large,
+ atEOF: true,
+ in: "THIS IS α ΤΕΣΤ",
+ out: "this is α ΤΕΣΤ",
+ outFull: "this is α ΤΕΣΤ",
+ errSpan: transform.ErrEndOfSpan,
+ t: f(unicode.Greek, nil, toLower),
+ }, {
+ desc: "nop in latin",
+ szDst: large,
+ atEOF: true,
+ in: "THIS IS α ΤΕΣΤ",
+ out: "THIS IS α τεστ",
+ outFull: "THIS IS α τεστ",
+ errSpan: transform.ErrEndOfSpan,
+ t: f(unicode.Latin, nil, toLower),
+ }, {
+ desc: "nop not in",
+ szDst: large,
+ atEOF: true,
+ in: "THIS IS α ΤΕΣΤ",
+ out: "this is α ΤΕΣΤ",
+ outFull: "this is α ΤΕΣΤ",
+ errSpan: transform.ErrEndOfSpan,
+ t: f(unicode.Latin, toLower, nil),
+ }, {
+ desc: "pass atEOF is true when at end",
+ szDst: large,
+ atEOF: true,
+ in: "hello",
+ out: "HELLO",
+ outFull: "HELLO",
+ errSpan: transform.ErrEndOfSpan,
+ t: f(unicode.Latin, upperAtEOF{}, nil),
+ }, {
+ desc: "pass atEOF is true when at end of segment",
+ szDst: large,
+ atEOF: true,
+ in: "hello ",
+ out: "HELLO ",
+ outFull: "HELLO ",
+ errSpan: transform.ErrEndOfSpan,
+ t: f(unicode.Latin, upperAtEOF{}, nil),
+ }, {
+ desc: "don't pass atEOF is true when atEOF is false",
+ szDst: large,
+ atEOF: false,
+ in: "hello",
+ out: "",
+ outFull: "HELLO",
+ err: transform.ErrShortSrc,
+ errSpan: transform.ErrShortSrc,
+ t: f(unicode.Latin, upperAtEOF{}, nil),
+ }, {
+ desc: "pass atEOF is true when at end, no change",
+ szDst: large,
+ atEOF: true,
+ in: "HELLO",
+ out: "HELLO",
+ outFull: "HELLO",
+ t: f(unicode.Latin, upperAtEOF{}, nil),
+ }, {
+ desc: "pass atEOF is true when at end of segment, no change",
+ szDst: large,
+ atEOF: true,
+ in: "HELLO ",
+ out: "HELLO ",
+ outFull: "HELLO ",
+ t: f(unicode.Latin, upperAtEOF{}, nil),
+ }, {
+ desc: "large input ASCII",
+ szDst: 12000,
+ atEOF: false,
+ in: strings.Repeat("HELLO", 2000),
+ out: strings.Repeat("hello", 2000),
+ outFull: strings.Repeat("hello", 2000),
+ errSpan: transform.ErrEndOfSpan,
+ err: nil,
+ t: lower,
+ }, {
+ desc: "large input non-ASCII",
+ szDst: 12000,
+ atEOF: false,
+ in: strings.Repeat("\u3333", 2000),
+ out: strings.Repeat("\u3333", 2000),
+ outFull: strings.Repeat("\u3333", 2000),
+ err: nil,
+ t: lower,
+ }} {
+ tt.check(t, i)
+ }
+}
+
+// upperAtEOF is a strange Transformer that converts text to uppercase, but only
+// if atEOF is true.
+type upperAtEOF struct{ transform.NopResetter }
+
+func (upperAtEOF) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
+ if !atEOF {
+ return 0, 0, transform.ErrShortSrc
+ }
+ return toUpper.Transform(dst, src, atEOF)
+}
+
+func (upperAtEOF) Span(src []byte, atEOF bool) (n int, err error) {
+ if !atEOF {
+ return 0, transform.ErrShortSrc
+ }
+ return toUpper.Span(src, atEOF)
+}
+
+func BenchmarkConditional(b *testing.B) {
+ doBench(b, If(In(unicode.Hangul), transform.Nop, transform.Nop))
+}