truncate_test.go (3501B)
1 // Copyright 2016 The Hugo Authors. All rights reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 // http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13
14 package strings
15
16 import (
17 "html/template"
18 "reflect"
19 "strings"
20 "testing"
21 )
22
23 func TestTruncate(t *testing.T) {
24 t.Parallel()
25
26 var err error
27 cases := []struct {
28 v1 any
29 v2 any
30 v3 any
31 want any
32 isErr bool
33 }{
34 {10, "I am a test sentence", nil, template.HTML("I am a …"), false},
35 {10, "", "I am a test sentence", template.HTML("I am a"), false},
36 {10, "", "a b c d e f g h i j k", template.HTML("a b c d e"), false},
37 {12, "", "<b>Should be escaped</b>", template.HTML("<b>Should be"), false},
38 {10, template.HTML(" <a href='#'>Read more</a>"), "I am a test sentence", template.HTML("I am a <a href='#'>Read more</a>"), false},
39 {20, template.HTML("I have a <a href='/markdown'>Markdown link</a> inside."), nil, template.HTML("I have a <a href='/markdown'>Markdown …</a>"), false},
40 {10, "IamanextremelylongwordthatjustgoesonandonandonjusttoannoyyoualmostasifIwaswritteninGermanActuallyIbettheresagermanwordforthis", nil, template.HTML("Iamanextre …"), false},
41 {10, template.HTML("<p>IamanextremelylongwordthatjustgoesonandonandonjusttoannoyyoualmostasifIwaswritteninGermanActuallyIbettheresagermanwordforthis</p>"), nil, template.HTML("<p>Iamanextre …</p>"), false},
42 {13, template.HTML("With <a href=\"/markdown\">Markdown</a> inside."), nil, template.HTML("With <a href=\"/markdown\">Markdown …</a>"), false},
43 {14, "Hello中国 Good 好的", nil, template.HTML("Hello中国 Good 好 …"), false},
44 {15, "", template.HTML("A <br> tag that's not closed"), template.HTML("A <br> tag that's"), false},
45 {14, template.HTML("<p>Hello中国 Good 好的</p>"), nil, template.HTML("<p>Hello中国 Good 好 …</p>"), false},
46 {2, template.HTML("<p>P1</p><p>P2</p>"), nil, template.HTML("<p>P1 …</p>"), false},
47 {3, template.HTML(strings.Repeat("<p>P</p>", 20)), nil, template.HTML("<p>P</p><p>P</p><p>P …</p>"), false},
48 {18, template.HTML("<p>test <b>hello</b> test something</p>"), nil, template.HTML("<p>test <b>hello</b> test …</p>"), false},
49 {4, template.HTML("<p>a<b><i>b</b>c d e</p>"), nil, template.HTML("<p>a<b><i>b</b>c …</p>"), false},
50 {10, nil, nil, template.HTML(""), true},
51 {nil, nil, nil, template.HTML(""), true},
52 }
53 for i, c := range cases {
54 var result template.HTML
55 if c.v2 == nil {
56 result, err = ns.Truncate(c.v1)
57 } else if c.v3 == nil {
58 result, err = ns.Truncate(c.v1, c.v2)
59 } else {
60 result, err = ns.Truncate(c.v1, c.v2, c.v3)
61 }
62
63 if c.isErr {
64 if err == nil {
65 t.Errorf("[%d] Slice didn't return an expected error", i)
66 }
67 } else {
68 if err != nil {
69 t.Errorf("[%d] failed: %s", i, err)
70 continue
71 }
72 if !reflect.DeepEqual(result, c.want) {
73 t.Errorf("[%d] got '%s' but expected '%s'", i, result, c.want)
74 }
75 }
76 }
77
78 // Too many arguments
79 _, err = ns.Truncate(10, " ...", "I am a test sentence", "wrong")
80 if err == nil {
81 t.Errorf("Should have errored")
82 }
83 }