added tests for substring filter and fixed a bunch of bugs in substring filter
This commit is contained in:
parent
9763c72be7
commit
c0709aff6a
2 changed files with 84 additions and 9 deletions
40
scraping.go
40
scraping.go
|
@ -69,23 +69,45 @@ func getFilterResultSubstring(s string, filter *Filter) string {
|
||||||
asRunes := []rune(s)
|
asRunes := []rune(s)
|
||||||
|
|
||||||
for _, substring := range substrings {
|
for _, substring := range substrings {
|
||||||
if strings.Contains(substring, "-") {
|
if strings.Contains(substring, ":") {
|
||||||
from_to := strings.Split(substring, "-")
|
from_to := strings.Split(substring, ":")
|
||||||
if len(from_to) != 2 {
|
if len(from_to) != 2 {
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
from, err := strconv.ParseInt(from_to[0], 10, 32)
|
fromStr := from_to[0]
|
||||||
if err != nil {
|
var hasFrom bool = true
|
||||||
return s
|
if fromStr == "" {
|
||||||
|
hasFrom = false
|
||||||
}
|
}
|
||||||
to, err := strconv.ParseInt(from_to[1], 10, 32)
|
from64, err := strconv.ParseInt(fromStr, 10, 32)
|
||||||
if err != nil {
|
var from = int(from64)
|
||||||
|
if hasFrom && err != nil {
|
||||||
return s
|
return s
|
||||||
|
} else if from < 0 {
|
||||||
|
from = len(asRunes) + from
|
||||||
|
}
|
||||||
|
toStr := from_to[1]
|
||||||
|
var hasTo bool = true
|
||||||
|
if toStr == "" {
|
||||||
|
hasTo = false
|
||||||
|
}
|
||||||
|
to64, err := strconv.ParseInt(toStr, 10, 32)
|
||||||
|
var to = int(to64)
|
||||||
|
if hasTo && err != nil {
|
||||||
|
return s
|
||||||
|
} else if to < 0 {
|
||||||
|
to = len(asRunes) + to
|
||||||
|
}
|
||||||
|
if hasFrom && hasTo {
|
||||||
|
sb.WriteString(string(asRunes[from:to]))
|
||||||
|
} else if hasFrom {
|
||||||
|
sb.WriteString(string(asRunes[from:]))
|
||||||
|
} else if hasTo {
|
||||||
|
sb.WriteString(string(asRunes[:to]))
|
||||||
}
|
}
|
||||||
sb.WriteString(string(asRunes[from:to]))
|
|
||||||
} else {
|
} else {
|
||||||
pos, err := strconv.ParseInt(substring, 10, 32)
|
pos, err := strconv.ParseInt(substring, 10, 32)
|
||||||
if err != nil {
|
if err != nil || pos < 0 {
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
sb.WriteRune(asRunes[pos])
|
sb.WriteRune(asRunes[pos])
|
||||||
|
|
53
scraping_test.go
Normal file
53
scraping_test.go
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestFilterSubstring(t *testing.T) {
|
||||||
|
var tests = []struct {
|
||||||
|
Input string
|
||||||
|
Query string
|
||||||
|
Want string
|
||||||
|
}{
|
||||||
|
{"0123456789", "0", "0"},
|
||||||
|
{"0123456789", "9", "9"},
|
||||||
|
{"0123456789", "0,9", "09"},
|
||||||
|
{"0123456789", "0:3", "012"},
|
||||||
|
{"0123456789", ":3", "012"},
|
||||||
|
{"0123456789", "3:", "3456789"},
|
||||||
|
{"0123456789", "-3:", "789"},
|
||||||
|
{"0123456789", ":-3", "0123456"},
|
||||||
|
{"0123456789", ":-1", "012345678"},
|
||||||
|
|
||||||
|
{"0123456789", "0,3,7,9", "0379"},
|
||||||
|
{"0123456789", "0:3,7,9", "01279"},
|
||||||
|
|
||||||
|
{"世界", "1", "界"},
|
||||||
|
{"世界日本語", ":3", "世界日"},
|
||||||
|
{"世界日本語", ":-1", "世界日本"},
|
||||||
|
{"世界日本語", "-1:", "語"},
|
||||||
|
|
||||||
|
{"0123456789", "A", "0123456789"},
|
||||||
|
{"0123456789", "1:A", "0123456789"},
|
||||||
|
{"0123456789", "A:1", "0123456789"},
|
||||||
|
{"0123456789", "A:B", "0123456789"},
|
||||||
|
{"0123456789", "A:B:C", "0123456789"},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range tests {
|
||||||
|
testname := fmt.Sprintf("%s %s", test.Input, test.Query)
|
||||||
|
t.Run(testname, func(t *testing.T) {
|
||||||
|
result := getFilterResultSubstring(
|
||||||
|
test.Input,
|
||||||
|
&Filter{
|
||||||
|
From: test.Query,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
if result != test.Want {
|
||||||
|
t.Errorf("Got %s, want %s", result, test.Want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue