github.com/markusbkk/elvish@v0.0.0-20231204143114-91dc52438621/pkg/mods/str/str_test.go (about)

     1  package str
     2  
     3  import (
     4  	"fmt"
     5  	"strconv"
     6  	"testing"
     7  	"unicode"
     8  
     9  	"github.com/markusbkk/elvish/pkg/eval"
    10  	"github.com/markusbkk/elvish/pkg/eval/errs"
    11  	. "github.com/markusbkk/elvish/pkg/eval/evaltest"
    12  )
    13  
    14  func TestStr(t *testing.T) {
    15  	setup := func(ev *eval.Evaler) {
    16  		ev.ExtendGlobal(eval.BuildNs().AddNs("str", Ns))
    17  	}
    18  	TestWithSetup(t, setup,
    19  		That(`str:compare abc`).Throws(ErrorWithType(errs.ArityMismatch{})),
    20  		That(`str:compare abc abc`).Puts(0),
    21  		That(`str:compare abc def`).Puts(-1),
    22  		That(`str:compare def abc`).Puts(1),
    23  
    24  		That(`str:contains abc`).Throws(ErrorWithType(errs.ArityMismatch{})),
    25  		That(`str:contains abcd x`).Puts(false),
    26  		That(`str:contains abcd bc`).Puts(true),
    27  		That(`str:contains abcd cde`).Puts(false),
    28  
    29  		That(`str:contains-any abc`).Throws(ErrorWithType(errs.ArityMismatch{})),
    30  		That(`str:contains-any abcd x`).Puts(false),
    31  		That(`str:contains-any abcd xcy`).Puts(true),
    32  
    33  		That(`str:equal-fold abc`).Throws(ErrorWithType(errs.ArityMismatch{})),
    34  		That(`str:equal-fold ABC abc`).Puts(true),
    35  		That(`str:equal-fold abc ABC`).Puts(true),
    36  		That(`str:equal-fold abc A`).Puts(false),
    37  
    38  		That(`str:from-codepoints 0x61`).Puts("a"),
    39  		That(`str:from-codepoints 0x4f60 0x597d`).Puts("你好"),
    40  		That(`str:from-codepoints -0x1`).Throws(errs.OutOfRange{
    41  			What:     "codepoint",
    42  			ValidLow: "0", ValidHigh: strconv.Itoa(unicode.MaxRune),
    43  			Actual: "-0x1"}),
    44  
    45  		That(fmt.Sprintf(`str:from-codepoints 0x%x`, unicode.MaxRune+1)).Throws(errs.OutOfRange{
    46  			What:     "codepoint",
    47  			ValidLow: "0", ValidHigh: strconv.Itoa(unicode.MaxRune),
    48  			Actual: hex(unicode.MaxRune + 1)}),
    49  
    50  		That(`str:from-codepoints 0xd800`).Throws(errs.BadValue{
    51  			What:   "argument to str:from-codepoints",
    52  			Valid:  "valid Unicode codepoint",
    53  			Actual: "0xd800"}),
    54  
    55  		That(`str:from-utf8-bytes 0x61`).Puts("a"),
    56  		That(`str:from-utf8-bytes 0xe4 0xbd 0xa0 0xe5 0xa5 0xbd`).Puts("你好"),
    57  		That(`str:from-utf8-bytes -1`).Throws(errs.OutOfRange{
    58  			What:     "byte",
    59  			ValidLow: "0", ValidHigh: "255", Actual: strconv.Itoa(-1)}),
    60  
    61  		That(`str:from-utf8-bytes 256`).Throws(errs.OutOfRange{
    62  			What:     "byte",
    63  			ValidLow: "0", ValidHigh: "255", Actual: strconv.Itoa(256)}),
    64  
    65  		That(`str:from-utf8-bytes 0xff 0x3 0xaa`).Throws(errs.BadValue{
    66  			What:   "arguments to str:from-utf8-bytes",
    67  			Valid:  "valid UTF-8 sequence",
    68  			Actual: "[255 3 170]"}),
    69  
    70  		That(`str:has-prefix abc`).Throws(ErrorWithType(errs.ArityMismatch{})),
    71  		That(`str:has-prefix abcd ab`).Puts(true),
    72  		That(`str:has-prefix abcd cd`).Puts(false),
    73  
    74  		That(`str:has-suffix abc`).Throws(ErrorWithType(errs.ArityMismatch{})),
    75  		That(`str:has-suffix abcd ab`).Puts(false),
    76  		That(`str:has-suffix abcd cd`).Puts(true),
    77  
    78  		That(`str:index abc`).Throws(ErrorWithType(errs.ArityMismatch{})),
    79  		That(`str:index abcd cd`).Puts(2),
    80  		That(`str:index abcd de`).Puts(-1),
    81  
    82  		That(`str:index-any abc`).Throws(ErrorWithType(errs.ArityMismatch{})),
    83  		That(`str:index-any "chicken" "aeiouy"`).Puts(2),
    84  		That(`str:index-any l33t aeiouy`).Puts(-1),
    85  
    86  		That(`str:join : [/usr /bin /tmp]`).Puts("/usr:/bin:/tmp"),
    87  		That(`str:join : ['' a '']`).Puts(":a:"),
    88  		That(`str:join : [(float64 1) 2]`).Throws(
    89  			errs.BadValue{What: "input to str:join", Valid: "string", Actual: "number"}),
    90  
    91  		That(`str:last-index abc`).Throws(ErrorWithType(errs.ArityMismatch{})),
    92  		That(`str:last-index "elven speak elvish" "elv"`).Puts(12),
    93  		That(`str:last-index "elven speak elvish" "romulan"`).Puts(-1),
    94  
    95  		That(`str:replace : / ":usr:bin:tmp"`).Puts("/usr/bin/tmp"),
    96  		That(`str:replace &max=2 : / :usr:bin:tmp`).Puts("/usr/bin:tmp"),
    97  
    98  		That(`str:split : /usr:/bin:/tmp`).Puts("/usr", "/bin", "/tmp"),
    99  		That(`str:split : /usr:/bin:/tmp &max=2`).Puts("/usr", "/bin:/tmp"),
   100  		That(`str:split : a:b >&-`).Throws(eval.ErrNoValueOutput),
   101  
   102  		That(`str:to-codepoints a`).Puts("0x61"),
   103  		That(`str:to-codepoints 你好`).Puts("0x4f60", "0x597d"),
   104  		That(`str:to-codepoints 你好 | str:from-codepoints (all)`).Puts("你好"),
   105  		That(`str:to-codepoints a >&-`).Throws(eval.ErrNoValueOutput),
   106  
   107  		That(`str:to-utf8-bytes a`).Puts("0x61"),
   108  		That(`str:to-utf8-bytes 你好`).Puts("0xe4", "0xbd", "0xa0", "0xe5", "0xa5", "0xbd"),
   109  		That(`str:to-utf8-bytes 你好 | str:from-utf8-bytes (all)`).Puts("你好"),
   110  		That(`str:to-utf8-bytes a >&-`).Throws(eval.ErrNoValueOutput),
   111  
   112  		That(`str:title abc`).Puts("Abc"),
   113  		That(`str:title "abc def"`).Puts("Abc Def"),
   114  		That(`str:to-lower abc def`).Throws(ErrorWithType(errs.ArityMismatch{})),
   115  
   116  		That(`str:to-lower abc`).Puts("abc"),
   117  		That(`str:to-lower ABC`).Puts("abc"),
   118  		That(`str:to-lower ABC def`).Throws(ErrorWithType(errs.ArityMismatch{})),
   119  
   120  		That(`str:to-title "her royal highness"`).Puts("HER ROYAL HIGHNESS"),
   121  		That(`str:to-title "хлеб"`).Puts("ХЛЕБ"),
   122  
   123  		That(`str:to-upper abc`).Puts("ABC"),
   124  		That(`str:to-upper ABC`).Puts("ABC"),
   125  		That(`str:to-upper ABC def`).Throws(ErrorWithType(errs.ArityMismatch{})),
   126  
   127  		That(`str:trim "¡¡¡Hello, Elven!!!" "!¡"`).Puts("Hello, Elven"),
   128  		That(`str:trim def`).Throws(ErrorWithType(errs.ArityMismatch{})),
   129  
   130  		That(`str:trim-left "¡¡¡Hello, Elven!!!" "!¡"`).Puts("Hello, Elven!!!"),
   131  		That(`str:trim-left def`).Throws(ErrorWithType(errs.ArityMismatch{})),
   132  
   133  		That(`str:trim-prefix "¡¡¡Hello, Elven!!!" "¡¡¡Hello, "`).Puts("Elven!!!"),
   134  		That(`str:trim-prefix "¡¡¡Hello, Elven!!!" "¡¡¡Hola, "`).Puts("¡¡¡Hello, Elven!!!"),
   135  		That(`str:trim-prefix def`).Throws(ErrorWithType(errs.ArityMismatch{})),
   136  
   137  		That(`str:trim-right "¡¡¡Hello, Elven!!!" "!¡"`).Puts("¡¡¡Hello, Elven"),
   138  		That(`str:trim-right def`).Throws(ErrorWithType(errs.ArityMismatch{})),
   139  
   140  		That(`str:trim-space " \t\n Hello, Elven \n\t\r\n"`).Puts("Hello, Elven"),
   141  		That(`str:trim-space " \t\n Hello  Elven \n\t\r\n"`).Puts("Hello  Elven"),
   142  		That(`str:trim-space " \t\n Hello  Elven \n\t\r\n" argle`).
   143  			Throws(ErrorWithType(errs.ArityMismatch{})),
   144  
   145  		That(`str:trim-suffix "¡¡¡Hello, Elven!!!" ", Elven!!!"`).Puts("¡¡¡Hello"),
   146  		That(`str:trim-suffix "¡¡¡Hello, Elven!!!" ", Klingons!!!"`).Puts("¡¡¡Hello, Elven!!!"),
   147  		That(`str:trim-suffix "¡¡¡Hello, Elven!!!"`).Throws(ErrorWithType(errs.ArityMismatch{})),
   148  	)
   149  }