| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- package parse // import "github.com/tdewolff/parse"
- import (
- "bytes"
- "math/rand"
- "regexp"
- "testing"
- "github.com/tdewolff/test"
- )
- func helperRand(n, m int, chars []byte) [][]byte {
- r := make([][]byte, n)
- for i := range r {
- for j := 0; j < m; j++ {
- r[i] = append(r[i], chars[rand.Intn(len(chars))])
- }
- }
- return r
- }
- ////////////////////////////////////////////////////////////////
- var wsSlices [][]byte
- func init() {
- wsSlices = helperRand(100, 20, []byte("abcdefg \n\r\f\t"))
- }
- func TestCopy(t *testing.T) {
- foo := []byte("abc")
- bar := Copy(foo)
- foo[0] = 'b'
- test.String(t, string(foo), "bbc")
- test.String(t, string(bar), "abc")
- }
- func TestToLower(t *testing.T) {
- foo := []byte("Abc")
- bar := ToLower(foo)
- bar[1] = 'B'
- test.String(t, string(foo), "aBc")
- test.String(t, string(bar), "aBc")
- }
- func TestEqualFold(t *testing.T) {
- test.That(t, EqualFold([]byte("Abc"), []byte("abc")))
- test.That(t, !EqualFold([]byte("Abcd"), []byte("abc")))
- test.That(t, !EqualFold([]byte("Bbc"), []byte("abc")))
- }
- func TestWhitespace(t *testing.T) {
- test.That(t, IsAllWhitespace([]byte("\t \r\n\f")))
- test.That(t, !IsAllWhitespace([]byte("\t \r\n\fx")))
- }
- func TestReplaceMultipleWhitespace(t *testing.T) {
- wsRegexp := regexp.MustCompile("[ \t\f]+")
- wsNewlinesRegexp := regexp.MustCompile("[ ]*[\r\n][ \r\n]*")
- for _, e := range wsSlices {
- reference := wsRegexp.ReplaceAll(e, []byte(" "))
- reference = wsNewlinesRegexp.ReplaceAll(reference, []byte("\n"))
- test.Bytes(t, ReplaceMultipleWhitespace(e), reference, "must remove all multiple whitespace but keep newlines")
- }
- }
- func TestTrim(t *testing.T) {
- test.Bytes(t, TrimWhitespace([]byte("a")), []byte("a"))
- test.Bytes(t, TrimWhitespace([]byte(" a")), []byte("a"))
- test.Bytes(t, TrimWhitespace([]byte("a ")), []byte("a"))
- test.Bytes(t, TrimWhitespace([]byte(" ")), []byte(""))
- }
- ////////////////////////////////////////////////////////////////
- func BenchmarkBytesTrim(b *testing.B) {
- for i := 0; i < b.N; i++ {
- for _, e := range wsSlices {
- bytes.TrimSpace(e)
- }
- }
- }
- func BenchmarkTrim(b *testing.B) {
- for i := 0; i < b.N; i++ {
- for _, e := range wsSlices {
- TrimWhitespace(e)
- }
- }
- }
- func BenchmarkReplace(b *testing.B) {
- for i := 0; i < b.N; i++ {
- for _, e := range wsSlices {
- ReplaceMultipleWhitespace(e)
- }
- }
- }
- func BenchmarkWhitespaceTable(b *testing.B) {
- n := 0
- for i := 0; i < b.N; i++ {
- for _, e := range wsSlices {
- for _, c := range e {
- if IsWhitespace(c) {
- n++
- }
- }
- }
- }
- }
- func BenchmarkWhitespaceIf1(b *testing.B) {
- n := 0
- for i := 0; i < b.N; i++ {
- for _, e := range wsSlices {
- for _, c := range e {
- if c == ' ' {
- n++
- }
- }
- }
- }
- }
- func BenchmarkWhitespaceIf2(b *testing.B) {
- n := 0
- for i := 0; i < b.N; i++ {
- for _, e := range wsSlices {
- for _, c := range e {
- if c == ' ' || c == '\n' {
- n++
- }
- }
- }
- }
- }
- func BenchmarkWhitespaceIf3(b *testing.B) {
- n := 0
- for i := 0; i < b.N; i++ {
- for _, e := range wsSlices {
- for _, c := range e {
- if c == ' ' || c == '\n' || c == '\r' {
- n++
- }
- }
- }
- }
- }
- func BenchmarkWhitespaceIf4(b *testing.B) {
- n := 0
- for i := 0; i < b.N; i++ {
- for _, e := range wsSlices {
- for _, c := range e {
- if c == ' ' || c == '\n' || c == '\r' || c == '\t' {
- n++
- }
- }
- }
- }
- }
- func BenchmarkWhitespaceIf5(b *testing.B) {
- n := 0
- for i := 0; i < b.N; i++ {
- for _, e := range wsSlices {
- for _, c := range e {
- if c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == '\f' {
- n++
- }
- }
- }
- }
- }
|